Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 我如何编写一个范围来返回所有未被给定用户投票的电影?_Ruby On Rails - Fatal编程技术网

Ruby on rails 我如何编写一个范围来返回所有未被给定用户投票的电影?

Ruby on rails 我如何编写一个范围来返回所有未被给定用户投票的电影?,ruby-on-rails,Ruby On Rails,在rails中,我有3个模型:Movie、Vote和User class Movie has_many :votes end class User has_many :votes end class Vote belongs_to :movie belongs_to :user end 对于模型电影,我有一个范围投票人,它返回给定用户投票的所有电影 class Movie scope :voted_by, ->(user) { includes(:vote

在rails中,我有3个模型:
Movie
Vote
User

class Movie
  has_many :votes
end

class User
  has_many :votes
end

class Vote
  belongs_to :movie
  belongs_to :user
end
对于模型
电影
,我有一个范围
投票人
,它返回给定用户投票的所有电影

class Movie
  scope :voted_by, ->(user) {
    includes(:votes).where(votes: { user: user })
  }
end
现在我需要另一个作用域
not\u voted\u by
,它的作用正好相反:它应该返回所有由给定用户投票的not电影

class Movie
  scope :voted_by, ->(user) {
    includes(:votes).where(votes: { user: user })
  }
end
我怎样才能做到这一点

到目前为止,我得出的结论是:

scope :not_voted_by, ->(user) {
  includes(:votes).where.not(votes: { user: user }).or(
    includes(:votes).where(votes: { user: nil })
  )
}
当一部电影由一个或零个用户投票时,它就起作用了。 但当电影由多个用户投票时,它就不起作用了

例如,如果电影
M
同时由用户
A
B
投票<代码>电影。未被(A)投票的电影仍然包括
M
,但它不应该包括


提前谢谢

包含在SQL中表示左连接。因此,您将所有记录添加到左侧的非
用户的位置。SQL

SELECT *
FROM movies
LEFT JOIN votes ON (votes.movie_id = movies.id)
WHERE votes.user_id <> 1
然后,如果
user.id=1
,则只查询排除第一条记录

所以,我认为你需要通过否定之前的范围来排除投票影片

scope :not_voted_by, ->(user) { where.not(id: voted_by(user) }