私は次の構造を持つアイテムの単純なタグ付けシステムを持っています:
class Item < ActiveRecord::Base
has_many :taggings, :dependent => :destroy
has_many :tags, :through => :taggings
end
class Tagging < ActiveRecord::Base
belongs_to :tag
belongs_to :item
end
class Tag < ActiveRecord::Base
has_many :taggings, :dependent => :destroy
end
クラスにを追加しscope
てItem
、特定のタグのセット(セット内のすべてのタグを含む)を持つすべてのアイテムを取得できるようにしたい
だから私は次のスコープを試しました:
scope :tag_context, lambda { |context| (context.empty? ? all :
joins(:taggings).where(:taggings => {tag_id => context.collect(&:id)})
)
}
ここcontext
で、 Array
はTag
オブジェクトのです。
重要なのは、このスコープが次のSQLを生成することです。
SELECT items.* FROM items INNER JOIN taggings ON taggings.item_id = items.id
WHERE taggings.tag_id IN (1,2)
context
タグ1と2が含まれていると仮定します。
タグ1とタグ2でタグ付けされたアイテムを取得したいので、次のようになります。
SELECT items.* FROM items INNER JOIN taggings as t1 ON t1.item_id = items.id
INNER JOIN taggings as t2 ON t2.item_id = items.id
WHERE t1.tag_id = 1 AND t2.tag_id = 2
Railsスコープでそれを翻訳するにはどうすればよいですか?Item
クラスのさまざまなスコープをチェーンできるようにするには、スコープが必要です。
ご協力いただきありがとうございます!