1

Предположим, у меня есть модель пользователя и модель фильма, а также таблицы для их хранения. Предположим, я хочу добавить функцию списка наблюдения, добавив третью таблицу с именем lists_movies, которая просто сопоставляет user_id с movie_id.Как получить ассоциацию Rails для использования определенного имени для доступа к модели другого имени?

Я хочу добавить в список избранных товаров. Я хочу иметь возможность запрашивать ActiveRecord с user.watchlist_movies и получать коллекцию объектов фильма. До сих пор я пытался (в user.rb)

has_many :watchlist_movies 

и

has_many :movies, through: watchlist_movies 

Первые результаты в user.watchlist_movies возвращающих записи и второй возвращает коллекцию записей фильмов в user.movies. По сути, я хочу, чтобы user.watchlist_movies возвращал коллекцию записей фильмов, поэтому я хочу, чтобы доступ, как определено в первом отношении, возвращал содержимое второго отношения. Как мне это сделать?

ответ

1

Здесь вы правильно определяете отношения, но у вас может быть случай, когда ваши ожидания не совпадают с тем, как Rails делает что-то. Если ваша структура связана с фильмом, связанным с пользователем через WatchlistMovie, которая является простой моделью соединения, вы на правильном пути.

Помните, что вы можете назвать ваши отношения все, что вы хотите:

has_many :watchlist_movie_associations, 
    class_name: 'WatchlistMovie' 

has_many :watchlist_movies, 
    class_name: 'Movie', 
    through: :watchlist_movie_associations 

Я бы посоветовал против этого, так как это идет вразрез с зерном, как ActiveRecord предпочитает называть вещи. Если это просто испугает вас прямо сейчас, это понятно, но если вы примете стиль вместо того, чтобы бороться с ним, у вас будет приложение, которое будет намного более последовательным и понятным.

+0

Так что я не понимаю, как вы думаете, лучший способ моделирования этих отношений. Вы говорите, что has_many: фильмы, через: lists_movies идеально? –

+0

Что вы имеете в своем первоначальном вопросе - это способ учебника, чтобы сделать это, и я бы не стал менять имена, если у вас не было очень веской причины. Личные предпочтения, когда они вступают в противоречие с соглашениями Rails, обычно следует игнорировать. Последовательность приводит к меньшему количеству неожиданностей в будущем. Теперь вам может показаться странным, но большинство разработчиков Rails обнаруживают, что ваш код там точно так, как ожидалось, так оно и будет. Вызов 'user.watchlist_movies' и получение модели фильма назад действительно запутывает кого-то, кто не знаком с вашими соглашениями об именах. – tadman

+0

Достаточно честный. Если я поеду на этот маршрут, должен ли я иметь модель lists_movies? Могу ли я просто иметь таблицу соединений без модели и использовать ассоциацию has_and_belongs_to_many? Кроме того, одна из причин, по которой я не хотел использовать user.movies, заключается в том, что в будущем у них могут быть другие списки. У них были бы фильмы через другие ассоциации. –