2010-04-20 3 views
2

방금 ​​문제가 발생한 문제를 해결하기 위해 친구가 stackoverflow를 참조했습니다. 나는 루비에 대해 상당히 새롭다. 나는 우리 웹 사이트에 다양한 참여와 성공을 바탕으로 사람들에게 다양한 메달을 수여하기 위해 일정한 간격으로 달리기 위해 예정된 스크립트 (medal_worker.rb)가있는 협업 프로젝트를 진행 중이다. 새로운 메달 중 하나는 "이정표"에 대한 사람들의 보상입니다. 이 문제의 목적을 위해 100, 1000, 10000 개의 의견을 달 때 메달을주고 싶다고합시다. 사용자 모델 (user.rb)의 named_scopes를 사용하여 필자가 찾고있는 사용자의 필터링 된 목록을 제공하여이 작업을 수행하고 싶습니다.Ruby on Rails : 중첩 된 named_scopes 사용

내 질문은 다음과 같습니다. 각각의 마일스톤 의견 수준 (각 사용자 모델의 named_scopes를 사용하는 것이 좋습니다)에 해당 메달이없는 사용자를 찾으려면 어떻게해야합니까? 나는 사용자 모델에서 named_scopes (user.rb)와에서 오전

다음
def award_comment_milestone(comments) 
    users = Users.frequent_comment_club_members(comments).not_awarded_medal(Medal.find_by_id(medal.id)) 
    for user in users do 
     award_medal(medal, nil, user) if @award 
    end 
end 

은 다음과 같습니다 :

named_scope :frequent_comment_club_members, lambda { |*args| 
     {:include => comment_records, :conditions => ['comment_records.comment_type = ? and comment_records.comments >= ?', 'User', (args.first || 0)]} 
} 

named_scope :not_awarded_medal, lambda { |medal| 
    {:include => :awards, :conditions => ['awards.medal_id not in (select awards.medal_id from awards where awards.medal_id = ?)", medal.id] } 
} 

다음

내 model_worker.rb 파일에서 exerpt입니다

이것은 내가 원하는대로 작동하지 않지만 named_scopes에 문제가 있는지 또는 arguements 또는 what을 전달하는 방법을 알지 못합니다. 감사.

+0

정확히 작동하지 않는 항목은 무엇입니까? – jonnii

답변

1

named_scopes 괜찮아요. 단 하나의 어포 스트로피로 시작하여 not_awarded_medal 조건문에 이중 어포 스트로피로 끝나는 것을 제외하고는.

편집 :

그것을 다시 가져 가라. not_awarded_medal named_scope가 꺼져 있습니다. 이 같은

시도 뭔가 :

named_scope :not_awarded_medal, lambda { |medal_id| 
    { :include => :awards, 
    :conditions => [ 
     "? not in (select awards.id from awards where awards.user_id = users.id)", medal_id 
    ] 
    } 
} 

지금이 다음과 같은 관계가 있다고 가정되는 검증되지 않은 : 당신이 has_many :through를 사용하는 경우

User: has_many :awards Award: belongs_to :user

을 join (users_awards) 테이블을보기 위해 SQL을 변경해야한다.

-

하지만 난 award_comment_milestone 기능에 몇 가지를 참조 할.

award_comment_milestone에 오는 매개 변수는 무엇입니까? 댓글의 배열입니까 아니면 댓글 개수입니까? 또한 medal은 어디에 정의되어 있습니까?

comments이 배열 인 경우 comments.lengthfrequent_comment_club_members에 전달해야합니다. 그것이 카운트라면, 나는 comments_count으로 이름을 변경하여 다음 사람이 로직을 더 빨리 이해할 수 있도록 할 것입니다.

일부 일반 관찰 :

  • not_awarded_medal 단지 medal_id 아니라 전체 개체
  • Medal.find_by_id(medal.id)을하고 (여러 쿼리를 수행 할 필요가 없습니다)를 취해야합니까? 당신은 이미 메달 오브제를 가지고 있습니다.
+0

빠른 피드백에 감사드립니다. 작은 따옴표와 큰 따옴표는 아마도 여기에 코드를 입력 한 방법 일 것이지만 좋은 관찰입니다. award_comment_milestone에 전달 된 매개 변수에 대해서는 지정하지 않았지만이 함수는 매회 3 회의 값 (100, 1000, 10000) 중 하나를 전달하여 호출하여 여러 마일스톤을 검사합니다. 100이 전달되었다고 가정 할 때, 나는 100 개가 넘는 코멘트를 가지고 있지만 아직이 이정표를위한 메달을받지 못한 사용자의 수를 찾고 싶습니다 (1000 및 10000과 동일). 아마도 comment_count 또는 comment_milestone을 주석과 비교하는 것이 좋습니다. – jadavis

+0

내 편집을 참조하십시오. 당신이'not_awarded_medal' named_scope에 문제가 있다고 생각합니다. –

+0

도움을 주셔서 감사합니다. – jadavis