0

활성 레코드와 직접 관계를 통해 has_many를 필터링하는 가장 좋은 방법을 찾는 데 어려움이 있습니다. 나는이 문제를 거의 다룰 수있는 많은 게시물을 찾았지만 아무 대답도 나에게 도움이되지 못했다.연관을 통해 has_many의 필드 필터링

그룹 :

 has_many :taggings, as: :taggable 
    has_many :tags, :through => :taggings 

사용자 :

 has_many :taggings, as: :taggable 
    has_many :tags, :through => :taggings 

나는 하나의 그룹 태그를

이 다음과 같은 방식의 작품을 일치 태그가 모든 사용자를 찾으려하지만 난 오히려 조립 것 쿼리를 포함한리스트

def interest_matches 
     matched_users = Array.new 
     self.tags.uniq.each do |tag| 
     tag.users.map{ |u| matched_users.push(u) unless matched_users.include?(u) } 
     end 
     matched_users 
    end 

많은 조언을드립니다.

답변

1

난 당신이 태그의 그룹 내 태그에 interest_matches를 호출된다고 가정하고,

마이너 참고 : 라인 1과 기능의 3, 두 번 self.tags.uniq을 요구하고있다. 또한,

unless matched_users.include?(u) 

위의 내용은 최선의 선택이 아니라 배열 내에서 사용자의 존재를 확인하기 위해 매번 한 번씩 배열을 반복합니다! 다음 번에는 끝에 .uniq 메소드를 호출하십시오.

어쨌든 질문에 대답하기 위해 사용자 테이블에 조인 테이블을 사용하는 것이 좋습니다.

방법, 또는 작동하지 않을 수 있습니다 (희망이 수행) :이에

@matched = [] 
group_of_tags = (i'm assuming this is predefined) 
@matched << User.joins(:tags).where(tag_name: group_of_tags.pluck(:name)) 
@matched.uniq 

100 %,하지만 그것을 나중에 아 .. 내가 중복이 선택 제거

+0

갈 :)를 제공합니다. . 감사! – errata

+0

문제 없습니까? 작동합니까? –

관련 문제