StudentsRetroller中的ActiveRecord :: StatementInvalid#destroy无法找到表'students_subjects'

时间:2013-12-31 04:38:33

标签: ruby-on-rails activerecord has-and-belongs-to-many

我有两个控制器

class Student < ActiveRecord::Base
  has_and_belongs_to_many :subjects
end

class Subject < ActiveRecord::Base
  has_and_belongs_to_many :semesters
  has_and_belongs_to_many :students
end

我的数据库表是

class CreateSubjects < ActiveRecord::Migration
  def self.up
    create_table :subjects do |t|
      t.string :name

      t.timestamps
    end
  end

  def self.down
    drop_table :subjects
  end
end

class CreateStudents < ActiveRecord::Migration
  def self.up
    create_table :students do |t|
      t.string :name
      t.string :dept

      t.timestamps
    end
  end

  def self.down
    drop_table :students
  end
end

我的编辑,展示,主题创作和学生工作都很好。但是当我尝试删除任何科目或学生时,我收到以下错误

  

SubjectsController中的ActiveRecord :: StatementInvalid#destroy

     

找不到表'students_subjects'

似乎应该有另一个名为'students_subjects'的表用于多对多关联。我怎么做?使用脚手架还是什么?我刚刚开始学习rails。

1 个答案:

答案 0 :(得分:4)

错误在于您错过了has_and_belongs_to_many关联中的联接表。您的editshowcreate studentsubject应该只能单独使用。在数据库中没有创建关联记录,因为缺少连接表。

创建迁移以添加连接表。请注意,您不需要此连接表的模型。

class CreateStudentsSubjects < ActiveRecord::Migration
  def self.up
    create_table :students_subjects, id: false do |t|
      t.references :student, null: false
      t.references :subject, null: false
    end

    # Add an unique index for better join speed!
    add_index(:students_subjects, [:student_id, :subject_id], :unique => true)
  end

  def self.down
    drop_table :students_subjects
  end
end

更新:

  

如何创建迁移?

从rails应用程序根目录发出以下命令:

rails g migration create_students_subjects

然后使用上面的类定义替换db/migrate/目录中生成的迁移文件的内容。然后执行rake db:migrate

请注意,我在上面的id: false方法中错过了create_table,告诉Rails不要为此表创建主键。我在此更新中添加了此选项。