1

これが私の最初の質問です。

指定されたすべての機能を持つすべてのテーマを提供するクエリを作成したいと考えています。

Theme、Features、ThemeFeatures の 3 つのモデルがあります。

テーマ has_many :features, :through => :theme_feautures

DB に 1 つの Theme オブジェクト (id:1、name:"theme_a") があるとします。(多くの) 機能があります [(id: 1, name:"feature_a"), (id: 2, name:"feature_b"), (id: 3, name:"feature_c")]

クエリは次のように機能するはずです: Theme.the_query(:features => {:id => [1,2]}) 、結果は Theme ですが、IDをこのように配置すると Theme.the_query(:features => {:id => [2,4]}) 結果はゼロでなければなりません。

私は Theme.joins(:features).where(:features => {:id => features_array_ids}) を構築しましたが、 features_array_ids 要素のいずれかを持つすべてのテーマを返します。features_array_ids = [2,4] の場合、 Theme が返されますが、それは望ましくありません。

文法の間違いで申し訳ありません。私の言いたいことを理解していただければ幸いです。

編集:

解決策が見つかりました

Theme.select("*").from("themes").joins("INNER JOIN theme_features ON themes.id = theme_features.id").where("EXISTS(SELECT theme_id FROM theme_features tf WHERE tf.feature_id IN (#{features_array_ids.join(", ")}) AND tf.theme_id = themes.id GROUP BY tf.theme_id HAVING COUNT(*) = #{features_array_ids.count})")
4

1 に答える 1