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

the*_*ror 108 migration ruby-on-rails associations

所以我在学校的课程中有这样的create_table:

create_table :courses do |t|
  t.string :name
  t.references :course
  t.timestamps
end
Run Code Online (Sandbox Code Playgroud)

但是我想要它参考另外两个课程,如:

has_many :transferrable_as # A Course
has_many :same_as          # Another Course
Run Code Online (Sandbox Code Playgroud)

我可以说以下吗?

t.references :transferrable_as, :as=> :course
Run Code Online (Sandbox Code Playgroud)

Rya*_*yan 141

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

t.references :transferable_as, index: true, foreign_key: {to_table: :courses}
t.references :same_as, index: true, foreign_key: {to_table: :courses}
Run Code Online (Sandbox Code Playgroud)

  • 这适用于Rails 5.1,其他建议都没有.它更干净,感觉很对. (8认同)
  • 我还读到,从Rails开始,`index`已被添加到外键中/sf/ask/2783898701/ (3认同)
  • 我使用Rails 5.1.4但它不起作用.当我在表格创建中指定一个`foreign_key`选项时,会产生一个错误,说我正在创建的表不存在......所以我怀疑官方API并不支持它. (2认同)
  • 据我所知,传递 `index:true` 是多余的,`t.references :transferable_as,foreign_key: {to_table: :courses}` 也会创建索引。 (2认同)

Tob*_*obi 85

你可以这样做:

create_table :courses do |t|
  t.string :name
  t.references :transferrable_as, references: :courses
  t.references :same_as, references: :courses
  t.timestamps
end
Run Code Online (Sandbox Code Playgroud)

或者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
Run Code Online (Sandbox Code Playgroud)

  • 关于无法将`foreign_key:true`添加到引用行的部分是让我沮丧的部分.添加`add_foreign_key`并为那些指定列名就可以了. (5认同)
  • 毕竟这是@MCB我意识到你一直都是对的.您上面的第一条评论是完全正确的 - "add_foreign_key"行负责通知数据库什么是外键.`references:`参数什么都不做. (2认同)

the*_*ror 13

我认为这个线程有更多不同的Rails-ish方式: Scaffolding ActiveRecord:相同数据类型的两列

在迁移中:

t.belongs_to:transferrable_as

t.belongs_to:same_as


Die*_*uer 7

作为对该问题的补充回答-模型应具有以下行以完成关联:

    belongs_to :transferrable_as, class_name: "Course"
    belongs_to :same_as, class_name: "Course"
Run Code Online (Sandbox Code Playgroud)