我正在创建一个电影列表应用程序,其中电影可以属于许多列表,并且列表中包含许多电影。我想使用联接表来关联这些List和Movie模型。我在控制台中创建此关联时遇到问题。
在控制台中尝试此代码时:
@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
我想念一些简单的东西吗?这是处理此问题的最佳方法吗?预先感谢。
答案 0 :(得分:1)
您在命名约定方面遇到了麻烦,
through: :lists_movies
建议Rails寻找ListsMovie
模型。您在调用基础表ListMovie
的同时调用了模型lists_movies
,这再次表明该模型将命名为ListsMovie
。
您可以更改与has_and_belongs_to_many
的关系,但是如果您想保留联接模型,则可以简单地将模型删除为ListsMovie
(确保相应地更改文件名)。您可能还想重命名模型,因为它不是最幸运的选择(将第一部分复数,有时会像您刚刚遇到的那样引起麻烦)。
答案 1 :(得分:0)
您输入的名称有误:重命名模型:ListsMovie
。请注意列表后的s
。
答案 2 :(得分:0)
这很奇怪。我在控制台中尝试了相同的操作,效果很好。我也不认为您定义的关联有任何问题。大胆猜测..您是否尝试重新启动控制台?因为如果您的控制台已经在运行,并且您添加了任何新模型,那么当前的控制台会话将不会处理它。您需要重新启动它或使用重新加载!