Ruby on rails 使用联接表的Rails关联

Ruby on rails 使用联接表的Rails关联,ruby-on-rails,Ruby On Rails,我正在创建一个电影列表应用程序,其中电影可以属于许多列表,并且列表中有许多电影。我想使用联接表来关联这些列表和电影模型。在控制台中创建此关联时遇到问题 在控制台中尝试此代码时: @bourne = Movie.create(title: "The Bourne Identity") @list = List.create(name: "Bourne Films") @list.movies << @bourne 我错过了一些简单的东西吗?这是最好的处理方法吗?提前感谢。您的命名不正

我正在创建一个电影列表应用程序,其中电影可以属于许多列表,并且列表中有许多电影。我想使用联接表来关联这些列表和电影模型。在控制台中创建此关联时遇到问题

在控制台中尝试此代码时:

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

我错过了一些简单的东西吗?这是最好的处理方法吗?提前感谢。

您的命名不正确:重命名您的模型:
ListsMovie
。注意列表后面的
s

您在命名约定方面遇到了一些问题

through: :lists_movies
建议Rails查找
ListsMovie
模型。您在调用基础表时调用了模型
ListMovie
,这再次表明该模型将命名为
ListMovie


您可以更改与
has_和\u belimited_to \u many
的关系,但如果您想保留联接模型,只需将模型删除到
列表视图
(请确保相应地更改文件名)。您也可以考虑重命名模型,因为这不是最幸运的选择(将第一部分多重化,有时确实会像您刚刚经历的那样造成麻烦)。

这很奇怪。我在控制台中尝试了同样的方法,效果非常好。此外,我认为您定义的关联没有任何问题。胡乱猜测..您是否尝试重新启动控制台?因为如果您的控制台已经在运行,并且您添加了任何新的型号,那么当前的控制台会话将不会接收它。您需要重新启动它或使用重新加载

Rails中的模型名不应该总是单数的吗?它看的是标题的末尾,而不是开头。结尾是“Lis…”电影
。电影是单数的。应该是这样的(顺便说一句,为了保持一致性,我也会更改文件名。)@btcline04你重新加载了控制台吗?这很奇怪。我在控制台中尝试了同样的方法,效果非常好。我重新加载了控制台,但仍然得到相同的命名错误。如果你修改了现有代码,请重新加载!会有用的。但是,如果添加了新文件或其他内容,则需要关闭当前控制台会话并再次启动控制台。
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
through: :lists_movies