快速概要。选择与所有给定记录有关系的记录
祭有属于许多功能 功能已属于许多产品
我想发现脑水肿ALL所选功能的所有产品。
实施例:
- 的Offering_1具有特征1
- 的Offering_2具有特征2
- 的Offering_3具有特征1和特征2
- 的Offering_4具有特征1,特征2和功能3
当我打电话Offering.with_features([1,2,3])
我期望找到只有这个Offering_4是因为是唯一一个具有三个特征的。
这似乎是一个愚蠢的问题,但我不能找到一个很好的连接,它返回的结果。所有加入我测试过returs有给定特征的任何,不ALL的产品。
想法?
UPDATE
继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查询是否足够? – doublea
连接表是'features_offerings',遵循导轨的约定。 当然,一个sql语句应该足够了。我应该能够将其翻译成AR查询语言。 –
很高兴看到这不是一个愚蠢的问题,因为目前还没有答案。 –