Rails迁移:t.references与替代名称?

时间:2010-05-29 02:57:16

标签: ruby-on-rails associations migration

所以我在学校的课程中有这样的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

5 个答案:

答案 0 :(得分:124)

您可以在初始迁移/列定义中完成所有操作(至少目前在Rails 5中):

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

答案 1 :(得分:78)

你可以这样做:

create_table :courses do |t|
  t.string :name
  t.references :transferrable_as, references: :courses
  t.references :same_as, references: :courses
  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

答案 2 :(得分:12)

我认为这个帖子有更多不同的Rails-ish方式: Scaffolding ActiveRecord: two columns of the same data type

在迁移中:

  

bel.belongs_to:transferrable_as

     

t.belongs_to:same_as

答案 3 :(得分:4)

作为这个问题的补充答案 - 模型应该有以下行来完成关联:

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

答案 4 :(得分:3)

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

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