Rails-ассоциации, использующие таблицы соединений - PullRequest
0 голосов
/ 03 октября 2018

Я создаю приложение «Список фильмов», в котором фильмы могут принадлежать многим спискам, а в списках много фильмов.Я хочу использовать таблицу соединений, чтобы связать эти модели списка и фильма.У меня проблемы с созданием этой ассоциации в консоли.

При попытке ввести этот код в консоли:

@bourne = Movie.create(title: "The Bourne Identity")
@list = List.create(name: "Bourne Films")
@list.movies << @bourne

Я получаю следующую ошибку:

NoMethodError: undefined method `movies' for #<List:0x007fe2ae380890>

Здесьмои модели и схемы:

class List < ApplicationRecord
  validates :name, presence: true

  has_many :list_movies
  has_many :movies, through: :list_movies
end

class Movie < ApplicationRecord
  has_many :list_movies
  has_many :lists, through: :list_movies
end

class ListMovie < ApplicationRecord
  belongs_to :list
  belongs_to :movie
end

Моя схема:

 create_table "lists", force: :cascade do |t|
   t.string "name"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
 end

 create_table "list_movies", id: false, force: :cascade do |t|
   t.bigint "list_id", null: false
   t.bigint "movie_id", null: false
 end

create_table "movies", force: :cascade do |t|
  t.string "title"
  t.string "poster"
  t.integer "year"
  t.integer "runtime"
  t.string "genre"
  t.string "director"
  t.string "plot"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

Я что-то упустил?Это лучший способ справиться с этим?Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

У вас небольшие проблемы с соглашениями об именах,

through: :lists_movies

предлагает Rails искать модель ListsMovie.Вы назвали свою модель ListMovie при вызове базовой таблицы lists_movies, что снова предполагает, что модель будет называться ListsMovie.

. Вы можете изменить свое отношение на has_and_belongs_to_many, но если выВы хотите сохранить модель объединения, вы можете просто удалить свою модель на ListsMovie (убедитесь, что изменили имя файла соответственно).Вы можете также подумать о переименовании модели, так как это не самый удачный выбор (если сделать первую часть множественной, это иногда вызывает проблемы, как вы только что испытали).

0 голосов
/ 03 октября 2018

Это странно .. я попробовал то же самое в моей консоли, и она отлично работала.Также я не думаю, что есть какие-то проблемы с ассоциациями, которые вы определили.Делая дикие предположения .. Вы пытались перезапустить консоль?Потому что, если ваша консоль уже запущена и вы добавили новую модель, текущий сеанс консоли не поднимет ее.Вам нужно перезапустить его или использовать перезагрузку!

0 голосов
/ 03 октября 2018

Вы назвали его неправильно: переименуйте вашу модель: ListsMovie.Обратите внимание на s после списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...