首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActiveRecord :查找具有所有条件的关联记录

ActiveRecord :查找具有所有条件的关联记录
EN

Stack Overflow用户
提问于 2014-02-13 05:55:43
回答 1查看 155关注 0票数 0

我正在尝试执行一个activerecord查询,它本质上是这样做的。

我有三位模特在一段多到多的关系中

代码语言:javascript
复制
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

现在,我希望找到所有具有IDs 1和2的修饰符的项。

我试过几件事,比如:

代码语言:javascript
复制
Item.includes(:modifiers).where(modifiers: {id: 1}).where(modifiers: {id: 2})

这将失败,因为它搜索ID =1和ID =2的修饰符,这些修饰符总是为false。

这也不管用

代码语言:javascript
复制
Item.includes(:modifiers).where(modifiers: {id: [1, 2]})

因为这会执行IN (1,2)查询,所以它返回带有1或2修饰符的项。

我似乎错过了一些很简单的东西,但我就是想不起来。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-13 06:21:58

它可以是:

代码语言:javascript
复制
        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写,则可能是:

代码语言:javascript
复制
  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,该语句需要稍加修改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21746327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档