我正在尝试执行一个主要执行以下操作的activerecord查询。
我在多对多关系中有3个模型
class Item < ActiveRecord::Base
has_many :item_modifiers, dependent: :destroy
has_many :modifiers, through: :item_modifiers
end
class ItemModifier < ActiveRecord::Base
belongs_to :item
belongs_to :modifier
end
class Modifier < ActiveRecord::Base
has_many :item_modifiers
has_many :items, through: :item_modifiers
end
现在我想查找所有包含ID为1和2
的修饰符的项目我尝试了几件事:
Item.includes(:modifiers).where(modifiers: {id: 1}).where(modifiers: {id: 2})
这会失败,因为它会搜索ID = 1 AND ID = 2且总是为false的修饰符。
这也不起作用
Item.includes(:modifiers).where(modifiers: {id: [1, 2]})
因为这会执行IN(1,2)查询,所以它返回修饰符为1或2的项目。我想要具有任何修饰符的项目,只要它们具有ID为1且AT LEAST 1修饰符的AT LEAST 1修饰符ID 2
我似乎错过了一些非常简单的事情,但我无法理解它。
提前致谢。
答案 0 :(得分:1)
它可能会像:
Item.joins(:item_modifiers).where("item_modifiers.modifier_id=1 OR
item_modifiers.modifier_id=2").group("items.id").having("COUNT(item_modifiers.id)=2")
如果用纯SQL编写,可能是:
SELECT I.*, COUNT(IM.id) FROM items as I INNER JOIN item_modifiers AS IM on I.id=IM.item_id
WHERE IM.modifier_id=1 OR IM.modifier_id=2 GROUP BY I.id HAVING COUNT(IM.id)=2
它将获得所有具有修饰符'id的项包括1和2.也许在不同的DB中,语句需要稍作修改。