これが私の最初の質問です。
指定されたすべての機能を持つすべてのテーマを提供するクエリを作成したいと考えています。
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})")