一尘不染

如何找到同时拥有cat和dog的用户?

sql

我想对具有多对一关系的2个表进行搜索,例如

class User << ActiveRecord::Base
  has_many :pets
end

class Pet << ActiveRecord::Base
  belongs_to :users
end

现在说我有一些像这样的数据

users

id        name
1         Bob
2         Joe
3         Brian

pets

id        user_id  animal
1         1        cat
2         1        dog
3         2        cat
4         3        dog

我想做的是创建一个活动记录查询,该查询将返回同时拥有cat和dog的用户(即用户1-Bob)。

到目前为止,我的尝试是

User.joins(:pets).where('pets.animal = ? AND pets.animal = ?','dog','cat')

现在,我明白了为什么这行不通-它正在寻找既是dog又是cat的宠物,因此什么也不返回。我不知道如何修改它来给我我想要的答案。有没有人有什么建议?这似乎应该很容易-
似乎不是特别不寻常的情况。

- -编辑 - -

正如我刚刚发现Squeel一样,向这个问题添加一点尾声。这使您可以像这样构建子查询;

User.where{id.in(Pet.where{animal == 'Cat'}.select{user_id} & id.in(Pet.where{animal == 'Dog'}.select{user_id}))

这就是它将进入我的应用程序的方式。


阅读 156

收藏
2021-03-10

共1个答案

一尘不染

使用子选择来约束结果:

User.joins(:pets).where(
  'id IN (SELECT user_id FROM pets WHERE animal = ?) AND
   id IN (SELECT user_id FROM pets WHERE animal = ?)',
  'cat', 'dog')
2021-03-10