我想对具有多对一关系的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}))
这就是它将进入我的应用程序的方式。
使用子选择来约束结果:
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')