ActiveRecord:查找包含所有条件的关联记录

时间:2014-02-13 05:55:44

标签: sql ruby-on-rails activerecord

我正在尝试执行一个主要执行以下操作的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

我似乎错过了一些非常简单的事情,但我无法理解它。

提前致谢。

1 个答案:

答案 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中,语句需要稍作修改。