使用联接表的Rails关联

时间:2018-10-03 01:15:12

标签: ruby-on-rails

我正在创建一个电影列表应用程序,其中电影可以属于许多列表,并且列表中包含许多电影。我想使用联接表来关联这些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

我想念一些简单的东西吗?这是处理此问题的最佳方法吗?预先感谢。

3 个答案:

答案 0 :(得分:1)

您在命名约定方面遇到了麻烦,

through: :lists_movies

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

您可以更改与has_and_belongs_to_many的关系,但是如果您想保留联接模型,则可以简单地将模型删除为ListsMovie(确保相应地更改文件名)。您可能还想重命名模型,因为它不是最幸运的选择(将第一部分复数,有时会像您刚刚遇到的那样引起麻烦)。

答案 1 :(得分:0)

您输入的名称有误:重命名模型:ListsMovie。请注意列表后的s

答案 2 :(得分:0)

这很奇怪。我在控制台中尝试了相同的操作,效果很好。我也不认为您定义的关联有任何问题。大胆猜测..您是否尝试重新启动控制台?因为如果您的控制台已经在运行,并且您添加了任何新模型,那么当前的控制台会话将不会处理它。您需要重新启动它或使用重新加载!