这是我在这里的第一个问题。
我想构建一个查询,它将为我提供具有所有指定功能的所有主题。
我有三个模型 Theme、Features 和 ThemeFeatures
主题 has_many :features, :through => :theme_feautures
假设数据库中有一个主题对象(id:1,名称:“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})")