查找多个关联匹配的Active Record对象(相同字段)

时间:2016-06-08 23:29:59

标签: ruby-on-rails postgresql activerecord

例如,我有一个Product和一个Favorite关联:

class Product < ApplicationRecord
  has_many :favorites
end
class Favorite < ApplicationRecord
  belongs_to :product
  belongs_to: user
end
class User < ApplicationRecord
  has_many :favorites
end

如何找到ID为1的用户和ID为2的用户收藏的产品?更好的是,只有这两个用户的产品才受到青睐(没有其他人喜欢它)。

我已尝试加入多个where个查询,但这并未返回任何结果。我在寻找答案时花了很多精力,但我真的只是碰壁了。

这是我最近的尝试:

Product.includes(:favorites).where(favorites: { user_id: 1 }).where(favorites: { user_id: 2 })

1 个答案:

答案 0 :(得分:2)

如果您的意思是产品或者用户都喜欢,那么您正在寻找的是:

Product.joins(:favorites).where(favorites: { user_id: [1, 2] })

但是,如果您正在寻找两个用户所青睐的产品,则解决方案是使用INTERSECT

SELECT products.id
FROM products INNER JOIN favorites 
  ON favorites.product_id = products.id
WHERE favorites.user_id = 1
INTERSECT
SELECT id
FROM products INNER JOIN favorites 
  ON favorites.product_id = products.id
WHERE favorites.user_id = 2

没有方便的方法将其写为ActiveRecord链(即您可能会发现自己使用find_by_sql),但它在Arel中是可行的。