У меня есть следующие классы, у которых есть сквозные отношения.
class Movie < ApplicationRecord
has_many :favourites, dependent: :destroy
has_many :users, through: :favourites
end
class Favourite < ApplicationRecord
belongs_to :user
belongs_to :movies
end
class User < ApplicationRecord
has_many :favourites, dependent: :destroy
has_many :movies, through: :favourites
end
У меня есть страница поиска, которая позволяет пользователям искать фильм по имени.Но мне также нужно показать, нравится ли фильм текущему пользователю.Итак, в основном у меня есть запрос, который выглядит примерно так (сокращен, чтобы сохранить его релевантность):
@movies = Movie.includes(favourites: :user)
.where(favourites: { user: [current_user, nil] })
Итак, в приведенном выше примере я получаю все фильмы и также пытаюсь получить все текущиеизбранное пользователя, но также возвращает результаты, если фильм еще не был добавлен в избранное.
Проблема, однако, теперь мне нужно получить избранное пользователя как:
@movies.each do |movie|
movie.favourites.first # current users fav movie
end
, потому что я выполняюПо запросу на фильм я получаю коллекцию избранного (что имеет смысл) для всех пользователей, но отфильтровано до текущего пользователя.Так что не идеально, что мне нужно пройтись и проверить избранное, как movie.favourites.first
- Мне немного странно.
Есть ли лучший запрос, который я мог бы выполнить, где я мог бы выполнить поиск по Favourite
и получитьвсе результаты фильма, которые пользователь еще не одобрил?Или, может быть, что-то еще.
Мне пришлось сделать что-то вроде
Favourite.includes(:movie)....
Но я не уверен, как получить все результаты, включая непривлекательные результаты фильмов для пользователя.