0

快速总结。

一个产品具有并属于许多功能 一个功能具有并且属于许多产品

我想找到具有所有选定功能的所有产品

例子:

  • 提供_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

有用!!但我会接受使用连接而不是子查询的其他想法。

4

1 回答 1

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。通常对我来说效果更好。在这种情况下,想想会使生成查询更容易。
  2. 建议使用斯坦福 DB 类的工具。早期关于关系代数和 SQL 查询的视频对我很有帮助。

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

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

干杯,

于 2013-01-31T19:16:36.603 回答