【问题标题】:Select records that have relations with all the given records选择与所有给定记录有关系的记录
【发布时间】: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


【解决方案1】:

认为查询将是这样的。让我知道它是否有效,否则将在稍后进行测试/修复。

"select offering_id from features_offerings where feature_id in (?) 
group by offering_id having count(distinct feature_id) = ?", 
feature_ids, feature_count

几件事:

  1. 建议使用合适的模型作为连接表,因此 has_many, :through 而不是 has_and_belongs_to_many。通常对我来说效果更好。在这种情况下,Think 会使生成查询变得更容易。
  2. 建议使用 Stanford DB 类工具。早期关于关系代数和 SQL 查询的视频对我很有帮助。

http://class2go.stanford.edu/db/Winter2013

该跑了。如果您需要更多,请再次联系。

干杯,

【讨论】: