В рельсах у меня есть 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
У меня есть область действия voted_by
для модели Movie
, которая возвращает все фильмы, за которые проголосовалипользователь.
class Movie
scope :voted_by, ->(user) {
includes(:votes).where(votes: { user: user })
}
end
Теперь я хочу еще одну область действия not_voted_by
, которая в точности противоположна: она должна возвращать все фильмы, за которые НЕ проголосовал данный пользователь.
Как мне этого добиться?
Что я придумаю до сих пор:
scope :not_voted_by, ->(user) {
includes(:votes).where.not(votes: { user: user }).or(
includes(:votes).where(votes: { user: nil })
)
}
Это работает, когда за фильм проголосовал один или ноль пользователей.Но это не работает, если за фильм проголосовали несколько пользователей.
Например, если за фильм M
проголосовали оба пользователя A
и B
.Movie.not_voted_by(A)
по-прежнему включает M
, хотя не должно.
Заранее спасибо!