0

簡単な要約。

オファリングは多くの機能を持ち、それに属します フィーチャーは多くのオファリングを持ち、それに属します

選択したすべての機能を備えたすべてのオファリングを検索したいと考えています。

例:

  • Offering_1 には feature1 があります
  • Offering_2 には feature2 があります
  • Offering_3 には feature1 と feature 2 があります
  • Offering_4 には、feature1、feature 2、feature 3 があります。

私が電話すると、3 つの機能を備えた唯一の Offering_4Offering.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

できます!!しかし、サブクエリの代わりに結合を使用する他のアイデアも受け入れます。

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_and_belongs_to_manyではなく、has_many 、:throughを使用することをお勧めします。一般的に私にとってはうまくいきます。この場合、クエリの生成が簡単になると思います。
  2. スタンフォードDBクラスでツールを使用することをお勧めします。関係代数とSQLクエリに関する初期のビデオは、私にとって非常に役に立ちました。

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

実行しました。繰り返しになりますが、さらに必要な場合はご連絡ください。

乾杯、

于 2013-01-31T19:16:36.603 に答える