快速总结。
一个产品具有并属于许多功能 一个功能具有并且属于许多产品
我想找到具有所有选定功能的所有产品。
例子:
- 提供_1 具有功能 1
- 提供_2 具有功能 2
- Offering_3 具有特征 1 和特征 2
- Offering_4 具有特征 1、特征 2 和特征 3
当我打电话时,Offering.with_features([1,2,3])
我希望只找到Offering_4,因为它是唯一具有这三个功能的产品。
这似乎是一个愚蠢的问题,但我找不到返回该结果的良好联接。我测试过的所有连接都会返回具有任何给定功能的产品,而不是ALL。
想法?
更新
按照doublea的建议,我创建了具有自己 ID 的表,而不是连接表。它的解决方案仍然有效,我已经实现了这样的:
# offering.rb
def self.with_features(features)
if features && features.any?
where(id: FeatureOfferingRelation.with_all_features(features).pluck(:offering_id))
else
scoped
end
end
# feature_offering_relation.rb
def self.with_all_features(features)
select(:offering_id)
.where(feature_id: features)
.group(:offering_id)
.having("count(distinct feature_id) = ?", features.size)
end
有用!!但我会接受使用连接而不是子查询的其他想法。