Sql 使用中间的联接表查找与另一个模型不关联的对象

Sql 使用中间的联接表查找与另一个模型不关联的对象,sql,ruby-on-rails,ruby,postgresql,activerecord,Sql,Ruby On Rails,Ruby,Postgresql,Activerecord,RubyonRails应用程序,带有ActiveRecord和Postgres数据库。我有两个模型的关系,中间有一个连接表,基本上每个用户都可以喜欢多部电影: 类电影 有很多用户喜欢的电影 有很多:用户,通过::用户电影 结束 类UserMovieLike 属于:电影 属于:用户 结束 类用户 有很多用户喜欢的电影 有很多:电影,通过::用户电影 结束 考虑到我有用户id,我可以轻松获取该用户喜欢的所有电影,例如: #movie.rb 作用域:liked,->(user\u id){joins

RubyonRails应用程序,带有ActiveRecord和Postgres数据库。我有两个模型的关系,中间有一个连接表,基本上每个用户都可以喜欢多部电影:

类电影
有很多用户喜欢的电影
有很多:用户,通过::用户电影
结束
类UserMovieLike
属于:电影
属于:用户
结束
类用户
有很多用户喜欢的电影
有很多:电影,通过::用户电影
结束
考虑到我有用户id,我可以轻松获取该用户喜欢的所有电影,例如:

#movie.rb
作用域:liked,->(user\u id){joins(:user\u movie\u likes)。其中('user\u movie\u likes.user\u id'=>user\u id)}
但是我不知道如何做相反的事情——所有给定用户还不喜欢的电影。如果我执行
where.not('user\u movie\u likes.user\u id'=>user\u id)
,它仍然会返回用户喜欢的电影,因为其他用户喜欢它们,并且不会返回根本没有喜欢的电影。现在我只是从
liked
范围中提取id,然后执行
where.not(id:liked\u id)
,但我确信在一个查询中有一个很好的方法来完成它。我在StackOverflow上发现了一些与此类似的问题,但它们是不同的情况,例如,查找不喜欢的电影等。

请尝试以下方法:

scope :liked, lambda { |user_id|
  joins("LEFT OUTER JOIN user_movie_likes ON user_movie_likes.movie_id = movies.id AND user_movie_likes.user_id = #{user_id}")
    .where('user_movie_likes.id IS NULL')
}

因为若并没有创建like,联接表中将并没有条目。我们不能像这样直接取回。您需要收集所有电影和用户喜欢的电影,并找出差异,以了解哪些电影不喜欢