假设我有一个具有流派的电影数据库,并且我想显示所有不包括某些特定流派的电影。我已经建立了所有协会,并且一切正常。

为此,我遇到了名为Squeel的gem,并编写了这段代码

movies = Movie.joins(:movie_genres).approved

# This is just an array of id's
included_genres = params[:genres][:included_genres]
excluded_genres = params[:genres][:excluded_genres]

if included_genres

  # This works just fine
  movies = movies.where(movie_genres: {genre_id: included_genres})

  # This works too but IMO MySQL IN operator is faster.
  #movies = movies.where{movie_genres.genre_id.eq_any included_genres}

end

if excluded_genres

  # Here is where the problems occurs, it generates perfectly nice SQL
  # but for some reason it doesn't work as expected.
  movies = movies.where{movie_genres.genre_id.not_eq_any excluded_genres}

  # If we do it this way, it will only not match those movies
  # that have all the selected genres at once, i need to match
  # all movies that have atleast one of the inputted genres
  #movies = movies.where("genre_id NOT IN (?)", excluded_genres)
  #movies = movies.where{movie_genres.genre_id.not_eq_all excluded_genres}

end

movies = movies.group(:id)


是的,感谢Squeel,我们得到了以下SQL:

SELECT `movies`.* FROM `movies`
INNER JOIN `movie_genres` ON `movie_genres`.`movie_id` = `movies`.`id`
WHERE ((`movie_genres`.`genre_id` != 10 OR `movie_genres`.`genre_id` != 12))
GROUP BY `movies`.`id`;


由于未按预期工作,因此未包含流派。

因此,结果是,where条件看起来甚至都不适用,因为我认为使用或不使用它都没有区别。

看截图:


有谁知道为什么它不起作用,我应该从哪里开始挖掘?

非常感谢所有帮助。

最佳答案

问题出在逻辑上,而不是sql。使用“或”逻辑,您希望获得满足任何条件的行,因此对于您的查询,您将获得ID为10的行,因为10!=12。使用WHERE IN-很好的方法

07-24 09:22