【发布时间】:2025-11-27 05:45:01
【问题描述】:
快速总结。
产品具有并属于许多功能 一项功能拥有并属于许多产品
我想查找具有所有所选功能的所有产品。
例子:
- 产品_1 具有功能1
- Offering_2 具有 feature2
- Offering_3 具有功能 1 和功能 2
- Feinging_4 具有特征 1、特征 2 和特征 3
当我致电Offering.with_features([1,2,3]) 时,我希望能仅找到 Offering_4,因为它是唯一具有这三个功能的产品。
这似乎是一个愚蠢的问题,但我找不到返回该结果的良好联接。我测试过的所有连接都返回具有ANY 给定功能的产品,而不是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
有效!!但我会接受使用连接而不是子查询的其他想法。
【问题讨论】:
-
您的联接表的名称是什么?原生 SQL 查询就足够了吗?
-
连接表是
features_offerings,遵循 Rails 的约定。当然,一个sql语句应该就够了。我应该能够将其翻译成 AR 查询语言。 -
很高兴看到这不是一个愚蠢的问题,因为还没有答案。
标签: ruby-on-rails join rails-activerecord