例如,我有一个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 })
答案 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中是可行的。