簡単な要約。
オファリングは多くの機能を持ち、それに属します フィーチャーは多くのオファリングを持ち、それに属します
選択したすべての機能を備えたすべてのオファリングを検索したいと考えています。
例:
- Offering_1 には feature1 があります
- Offering_2 には feature2 があります
- Offering_3 には feature1 と feature 2 があります
- Offering_4 には、feature1、feature 2、feature 3 があります。
私が電話すると、3 つの機能を備えた唯一の Offering_4がOffering.with_features([1,2,3])
見つかると思います。
ばかげた質問に思えるかもしれませんが、その結果を返す適切な結合が見つかりません。私がテストしたすべての結合は、 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
できます!!しかし、サブクエリの代わりに結合を使用する他のアイデアも受け入れます。