如何找到同时拥有猫狗的用户?

bra*_*rad 10 sql activerecord ruby-on-rails ruby-on-rails-3

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

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

class Pet << ActiveRecord::Base
  belongs_to :users
end
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我想要做的是创建一个活动记录查询,它将返回一个既有猫又有狗的用户(即用户1 - Bob).

到目前为止,我的尝试是

User.joins(:pets).where('pets.animal = ? AND pets.animal = ?','dog','cat')
Run Code Online (Sandbox Code Playgroud)

现在我明白了为什么这不起作用 - 它正在寻找一只既是狗又是猫的宠物,所以什么也不回报.我不知道怎么修改这个给我答案我想要的.有没有人有什么建议?这似乎应该很容易 - 它似乎不是一个特别不寻常的情况.

- -编辑 - -

我刚刚发现了Squeel,只是在这个问题上添加了一点点尾声.这允许您构建这样的子查询;

User.where{id.in(Pet.where{animal == 'Cat'}.select{user_id} & id.in(Pet.where{animal == 'Dog'}.select{user_id}))
Run Code Online (Sandbox Code Playgroud)

这将是我的应用程序的方式.

Clo*_*use 10

Andomar - 不幸的是,编写这样的查询并不一定总能按预期工作.具体来说,有2只猫将导致用户出现,并且有3只宠物 - 比方说,2只猫和一只狗 - 会导致它们被排除在外.
我对ActiveRecord了解不多,但以下是可行的标准SQL语法:

SELECT users.id
FROM Users
JOIN (SELECT user_id 
      FROM Pets
      WHERE animal IN ('dog', 'cat')
      GROUP BY user_id
      HAVING COUNT(DISTINCT animal)) Pets
  ON Pets.user_id = Users.id
Run Code Online (Sandbox Code Playgroud)

这个作品比通过计算不同的"类型"的宠物(现有版本的不同'cat''dog').


Jer*_*ers 6

使用子选择来约束结果:

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')
Run Code Online (Sandbox Code Playgroud)