在“引用”迁移指定列名(Specifying column name in a “reference

2019-07-04 11:26发布

我想打一个migration Rails中,引用另一个表。 通常情况下,我会做这样的事情:

add_column :post, :user, :references

这将创建一个名为列user_idposts表格。 但是,如果有什么,而不是user_id ,我想是这样author_id ? 我怎样才能做到这一点?

Answer 1:

手工进行:

add_column :post, :author_id, :integer

但现在,当您创建belongs_to的语句,你将不得不修改它,所以现在你必须调用

def post
    belongs_to :user, :foreign_key => 'author_id'
end


Answer 2:

4.2+您还可以设置Rails的 外键的分贝为好, 这是一个好主意 。

对于简单的协会这个也可以做了t.references添加foreign_key: true ,但在这种情况下,你需要两行。

# The migration
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id

# The model
belongs_to :author, class_name: "User"


Answer 3:

对于Rails的5+

最初的定义:

如果您要定义Post模型表格,您可以设置referencesindexforeign_key在一行:

t.references :author, index: true, foreign_key: { to_table: :users }

更新现有的:

如果要添加引用现有的表,你可以这样做:

add_reference :posts, :author, foreign_key: { to_table: :users }

注意 默认值为index是真实的。



Answer 4:

在轨道4,使用PostgreSQL和当schema_plus宝石,你可以只写

add_reference :posts, :author, references: :users

这将创建一个列author_id ,它正确地是指users(id)

而在你的模型,你写

belongs_to :author, class_name: "User"


Answer 5:

如果你不使用外键,那么也不要紧什么其他表的实际表名。

add_reference :posts, :author

铁轨5,如果您使用的是外键,你可以在国外关键选项指定其他表的名称。 (见https://github.com/rails/rails/issues/21563讨论)

add_reference :posts, :author, foreign_key: {to_table: :users}

到Rails 5之前,您应该添加外键作为一个单独的步骤:

add_foreign_key :posts, :users, column: :author_id


Answer 6:

alias_attribute(NEW_NAME,旧名称)是非常方便的。 您只需建立模型和关系:

rails g model Post title user:references

然后编辑该模型并添加属性别名用

alias_attribute :author, :user

之后,你就可以运行之类的东西

Post.new(title: 'My beautiful story', author: User.first)


文章来源: Specifying column name in a “references” migration