带有替代名称的引用?

所以我有一个这样的 create _ table,用于学校的课程:

create_table :courses do |t|
t.string :name
t.references :course
t.timestamps
end

但我希望它能参考 其他课程,比如:

has_many :transferrable_as # A Course
has_many :same_as          # Another Course

我能说下面的话吗?

t.references :transferrable_as, :as=> :course
95796 次浏览

我不认为 references接受 :as选项,但您可以手动创建您的列..。

create_table :courses do |t|
t.string  :name
t.integer :course1_id
t.integer :course2_id
t.timestamps
end

我认为这个线程有一种不同的更像 Rails 的方式: 脚手架式 ActiveRecord: 同一数据类型的两列

在迁徙过程中:

属于: 可转让的

属于: same _ as

你可以这样做:

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

作为对这个问题的补充回答——示范应该有以下一行来完成联系:

    belongs_to :transferrable_as, class_name: "Course"
belongs_to :same_as, class_name: "Course"

您可以在初始迁移/列定义中完成这一切(至少目前在 Rails 5中) :

t.references :transferable_as, index: true, foreign_key: {to_table: :courses}
t.references :same_as, index: true, foreign_key: {to_table: :courses}