class List < AR::Base
has_many :items
end
class Item < AR::Base
belongs_to :list
att_accessible :tag
end
我想要一个只返回带有所有传递给方法的标签的List的方法。
即。 filtered_lists = List.filter_by_item_tags(['tag1', 'tag2'])
我当前的实现返回一个包含tag1
或tag2
的列表我希望它返回仅列表两者 {{1 }和tag1
到目前为止我所拥有的:
tag2
答案 0 :(得分:2)
我认为joins
with condition可能会有所帮助。
你可以试试这样的东西(我没试过)
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)