我有两个控制器
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。
答案 0 :(得分:4)
错误在于您错过了has_and_belongs_to_many
关联中的联接表。您的edit
,show
,create
student
和subject
应该只能单独使用。在数据库中没有创建关联记录,因为缺少连接表。
创建迁移以添加连接表。请注意,您不需要此连接表的模型。
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不要为此表创建主键。我在此更新中添加了此选项。