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を返したいです tag1tag2

私がこれまでに持っているもの:

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
4

1 に答える 1

2

joins条件付きで参考になるかと思います。あなたはこのようなことを試すことができます(私はそれをテストしていません)

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)
于 2012-12-03T10:52:22.160 に答える