如何在Rails ActiveRecord中专门过滤相关模型中的标签

时间:2013-02-12 19:53:24

标签: ruby-on-rails ruby filter tags rails-activerecord

我目前有这个:

class Item < ActiveRecord::Base
  has_many :item_tags, :dependent => :delete_all
  has_many :tags, :through => :item_tags, :order => 'name ASC'

  scope :asc, order('filename ASC')
end

class Tag < ActiveRecord::Base
  has_many :item_tags, :dependent => :delete_all
  has_many :items, :through => :item_tags

  scope :asc, order('name ASC')

  validates_presence_of :name
  validates_uniqueness_of :name
end

class ItemTag < ActiveRecord::Base
  belongs_to :item
  belongs_to :tag

  scope :asc, order('position ASC')
end

我可以通过标签轻松地进行包容性过滤:

@items = Item.asc
@items = @items.joins(:item_tags).where('item_tags.tag_id' => params[:tags]) if params[:tags]
# params[:tags] contains a string of comma separated tags IDs like: "13,14,15"

但结果(当然)包括所有标记为13,14或15的项目。

如何构建仅返回标记为13 AND 14 AND 15的项的查询?

例如。如果我用“椅子”和“现代”标签过滤,我不想要所有椅子物品和所有现代物品。我只想要所有现代椅子。

1 个答案:

答案 0 :(得分:0)

答案在这里:Find Products matching ALL Categories (Rails 3.1)

我需要这样做:

tags = params[:tags].split(',')
Item.joins(:tags).where(:tags => {:id => tags}).group('items.id').having("count(item_tags.tag_id) = #{tags.count}")