Answers:
您可以在初始迁移/列定义(至少当前在Rails 5中)中完成所有操作:
t.references :transferable_as, index: true, foreign_key: {to_table: :courses}
t.references :same_as, index: true, foreign_key: {to_table: :courses}
foreign_key
这种方式在表创建中指定一个选项时,会引发一个错误,提示我正在创建的表不存在...因此,我怀疑官方API确实不支持该表。
index
已添加到外键的像Rails stackoverflow.com/questions/39769981/...
您可以这样操作:
create_table :courses do |t|
t.string :name
t.references :transferrable_as
t.references :same_as
t.timestamps
end
或t.belongs_to
用作别名t.references
您不能foreign_key: true
在这两个参考行中添加。如果要在数据库级别将它们标记为外键,则需要进行以下迁移:
add_foreign_key :courses, :courses, column: :transferrable_as_id
add_foreign_key :courses, :courses, column: :same_as_id
在Rails 5.1及更高版本中,您可以create_table
像这样在块中的迁移中添加外键:
create_table :courses do |t|
t.string :name
t.references :transferrable_as, foreign_key: { to_table: 'courses' }
t.references :same_as, foreign_key: { to_table: 'courses' }
t.timestamps
end
foreign_key: true
到参考行的部分使我感到震惊。添加add_foreign_key
并为这些列指定列名就可以了。
schema_plus
宝石。Rails的add_reference文档未提及:references选项。
references:
选项的用途(相反,那t.references
不是仅与模型级别相关,而是由external_key考虑的add_foreign_key
?来处理?
t.references
说:“向该表添加一个字段,该字段是另一个表的主键。” 该references:
选项告诉它它是哪个表的主键(如果字段名称不清楚,则需要此表)。该add_foreign_key
函数在此告诉数据库强制的参照完整性。
add_foreign_key
行负责通知数据库什么是什么的外键。该references:
参数不执行任何操作。
我认为该线程具有另一种更类似于Rails的方式: 脚手架ActiveRecord:相同数据类型的两列
在迁移中:
t.belongs_to:transferrable_as
t.belongs_to:same_as
PG::UndefinedTable: ERROR
,正在尝试向不存在的表添加外键约束。
作为对该问题的补充回答-模型应具有以下行以完成关联:
belongs_to :transferrable_as, class_name: "Course"
belongs_to :same_as, class_name: "Course"
我不references
接受该:as
选项,但是您可以手动创建列...
create_table :courses do |t|
t.string :name
t.integer :course1_id
t.integer :course2_id
t.timestamps
end