2010-01-18 3 views
4

레일 2.3.5를 사용하고 있습니다.하나 이상의 덧글을 게시 한 사용자 만 찾는 방법

이것은 일반적인 경우입니다. 테이블은 users, comments, user_comments입니다. 상태가 '활성'이고 하나 이상의 설명을 게시 한 모든 사용자를 찾아야합니다.

댓글 테이블에 외래 키가있을 수 있지만 이것이 고의적 인 예입니다. 이 테이블에는 두 명의 사용자가 있습니다. 두 가지 의견이 있습니다. 두 주석은 모두 첫 번째 사용자가 게시합니다. 내가

User.with_atleast_one_comment.with_active_status 

을 실행하면

named_scope :with_atleast_one_comment, lambda { { 
     :joins => 'inner join user_comments on users.id = user_comments.user_id ' } } 


named_scope :with_active_status, {:conditions => {:status => 'active'} }  

나는 두 개의 레코드를 얻을. 두 사람의 의견이 한 사용자에 의해 게시되기 때문에 한 사람 만 원합니다.

수정 사항

답변

5

with_at_least_one_comment 범위가 예상 한대로 작동하지 않습니다. 질문에 나타나면 user_comments의 각 항목에 대해 사용자를 선택합니다. 결과가 중복되어 표시됩니다. active_users와 혼합되면 with_at_least_one_comment에 의해 반환 된 활성 상태가 아닌 레코드를 제거합니다.

우선 문제가있는 명명 된 범위를 단순화하는 것으로 시작하십시오. 인수를 취할 필요가 없기 때문에 람다가 필요하지 않으며 조인은 연관이 주어지면 내부 조인을 수행하는 활성 레코드로 아웃소싱 될 수 있습니다.

즉,이 명명 된 범위는 원하는대로 정확하게 수행됩니다. 내가 해요 경우

named_scope :with_at_least_one_comment, :joins => :user_comments, 
    :group => 'users.id' 
0

컬렉션에서 중복을 제거하려면 : uniq => true 옵션을 지정하십시오. : through 옵션과 함께 사용하면 가장 유용합니다.

+0

하면 ArgumentError가 있어야합니다 : 알 수없는 키 (들) : 내가 할 경우 UNIQ을 : uniq => true, : 조인 => '내부 조인 user_comments on users.id = user_comments.user_id'}} –

+0

-1 : uniq은 명명 된 범위의 유효한 옵션이 아닙니다. – EmFi

0

는 ... 이것을 달성하기 위해 몇 가지 방법이, User.comments 않는
잘못 아닌가요?
또는 다른 방법은 컨트롤러 에 새로운 방법을 지정하고, 마지막으로 ...
는 Emfi의 정보는 작동 그것을위한 시도 ~

+0

귀하의 제안은 나쁘지 않습니다. 하지만 named_scopes의 장점을 부정하고 있습니다. 원하는 레코드 만 선택 될 때까지 ActiveRecord 개체의 채우기를 지연시키는 최적화입니다. 새 컨트롤러 메소드를 사용하거나 user.comments가 AR 객체를 채우는 모든 사용자를 선택하고 원하지 않는 사용자를 삭제해야하는 경우가 아니면. 이것은 매우 큰 SQL 질의/응답을 가져오고 주요 사용으로 인해 속도가 느려지고 페이지 매김을 버릴 수도 있습니다. – EmFi

+0

yea ... 당신이 맞습니다 ~ 내 잘못은 앱 성능에 대해 전혀 신경 쓰지 않습니다 ... 마지막 결론 Emfi의 답변은 최고입니다 ... – 1myb

관련 문제