0
class List < AR::Base 
    has_many :items 
end 

class Item < AR::Base 
    belongs_to :list 
    att_accessible :tag 
end 

나는 단지 목록의 과 방법에 전달 된 모든 태그를 반환하는 방법을하고자 협회를 찾아보십시오.레일은 독점적으로

:

filtered_lists = List.filter_by_item_tags(['tag1', 'tag2'])

내 현재 구현 나는 그것이 모두tag1 나는 지금까지 무엇을 가지고

tag2 목록을 반환하고 싶습니다 tag1 또는 tag2와 목록을 반환

class List < AR::Base 
    def self.filter_by_item_tags(tags) 
    items = Item.includes(:lists) 
    items.find_all_by_tag(tags).map(&:lists).flatten 
    end 
end 

답변

2

생각해 보면 joins with condition ma 도움이된다. 당신은 (내가 그것을 테스트하지했습니다)

def self.filter_by_item_tags(tags) 
    # Get items with the given tag, and check that all tags have been found 
    List.joins(:items).where("items.tag in (?) and count(distinct items.tag) = ?", tags, tags.length) 
end 

또는

List.joins(:items).select('count(distinct items.tag) as tags_count').where(:items => { :tag => tags }).group('tags_count').having('tags_count = ?', tags.length) 
이런 식으로 뭔가를 시도 할 수 있습니다