1

这是我在这里的第一个问题。

我想构建一个查询,它将为我提供具有所有指定功能的所有主题。

我有三个模型 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})")
4

1 回答 1

0

解决方案。

Theme.select("*").from("themes").joins("INNER JOIN theme_features ON themes.id = theme_features.theme_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})")
于 2013-10-19T09:01:21.180 回答