Ruby on rails 我如何编写一个范围来返回所有未被给定用户投票的电影?
在rails中,我有3个模型: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
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) }