Rails独家查找协会

时间:2012-12-03 10:34:05

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord ruby-on-rails-3.2

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'])

我当前的实现返回一个包含tag1tag2的列表我希望它返回列表两者 {{1 }和tag1

到目前为止我所拥有的:

tag2

1 个答案:

答案 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)