2013-10-23 10 views
1

저는 루비와 레일즈 모두에 대해 새롭고, 사이드 프로젝트를 선택하고 모범 사례를 연구하고 있습니다. 이 문제에 대한 권장 접근 방식이 무엇인지 궁금합니다.Ruby on Rails에서 모델 확장하기

나는 사용자가 부여한 관련 등급의 위젯이 있습니다. 보기에 위젯 목록을 표시 할 때 로그인 한 사용자가 주어진 등급을 제시하고 싶습니다.

내가 가지고있는 것 는 이렇게 보이지만 더럽다고 느낍니다. 내 컨트롤러에서 나는 어떤 위젯과 관련 등급 (다른 곳에서 사용되는 모든 등급)을 잡아, 해당 데이터에서 나는 myGrades 해시 생성 : 위젯을 제시 할 때 내 HAML보기에서

@widgets = Widget.include(:grades).limit(20) 
@myGrades = Hash[@widgets.collect{ |w| [w.id,w.grades.select{ |g| g.user_id==site_user.id}].delete_if{|k,v|v.nil?}] 

가, 내가 이런 식으로 뭔가를을 :

-if @myGrades.has_key?(widget.id) 
    .mygrade @myGrades[widget.id].value 

는하지만, 내가 같은 방법으로 더 나을 것 느낌 "I가이 등급이?" myGrades 중산층이없는 나의 채점 된 위젯에서 "MY 등급"을 제공하십시오. 결국 다른 객체가 많이 채점 될 것이므로 레일스에서 ​​이러한 방법을 가장 잘 구현하여 등급이 매겨진 모든 모델에 어떻게 적용 할 수 있습니까? 당신은 다음과 같은 작업을 수행 할 수

+1

'@my_grades = Widget.include (: 학년) 이야기 해봐 (성적 : {USER_ID : 사이트 ID}). 한계 (20)'어쩌면? – MrYoshiji

+1

@ MrYoshiji의 대답 외에도 얇은 컨트롤러, 레일의 뚱뚱한 모델을 존중하면서 위젯 모델의 코드로 코드를 옮겨보십시오. – sameera207

+0

나는 조금 더 파고 왔으며, 올바른 방법은 Grades 객체에 대한 "Association Extension". 나는 이미 성적 목록을 가지고 있으며 목록에 일부 기능을 추가하고 싶지만 실제로는 위젯 모델 자체에 추가하고 싶지 않습니다. –

답변

1

: @ sameera207는 지적

@my_grades = Widget.include(:grades).where(grades: {user_id: site_id}).limit(20) 

, 당신은 당신의 모델이 복잡한 쿼리를 이동해야합니다 : 범위를 만들 수 있습니다.

class Widget < ActiveRecord::Base 

    scope :for_user, lambda do |user, limit = 20| 
    includes(:grades).where(grades: {user_id: user.try(:id) || user}).limit(limit) 
    end 

그리고 다음과 같이 사용 :

Widget.for_user(user_id) 
# works also with a user object: 
Widget.for_user(user) 
# or if you want a custom limit: 
Widget.for_user(user_id, 50)