我想打一个migration
Rails中,引用另一个表。 通常情况下,我会做这样的事情:
add_column :post, :user, :references
这将创建一个名为列user_id
在posts
表格。 但是,如果有什么,而不是user_id
,我想是这样author_id
? 我怎样才能做到这一点?
我想打一个migration
Rails中,引用另一个表。 通常情况下,我会做这样的事情:
add_column :post, :user, :references
这将创建一个名为列user_id
在posts
表格。 但是,如果有什么,而不是user_id
,我想是这样author_id
? 我怎样才能做到这一点?
手工进行:
add_column :post, :author_id, :integer
但现在,当您创建belongs_to的语句,你将不得不修改它,所以现在你必须调用
def post
belongs_to :user, :foreign_key => 'author_id'
end
在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"
如果您要定义Post
模型表格,您可以设置references
, index
和foreign_key
在一行:
t.references :author, index: true, foreign_key: { to_table: :users }
如果要添加引用现有的表,你可以这样做:
add_reference :posts, :author, foreign_key: { to_table: :users }
注意: 默认值为index
是真实的。
在轨道4,使用PostgreSQL和当schema_plus宝石,你可以只写
add_reference :posts, :author, references: :users
这将创建一个列author_id
,它正确地是指users(id)
而在你的模型,你写
belongs_to :author, class_name: "User"
如果你不使用外键,那么也不要紧什么其他表的实际表名。
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
alias_attribute(NEW_NAME,旧名称)是非常方便的。 您只需建立模型和关系:
rails g model Post title user:references
然后编辑该模型并添加属性别名用
alias_attribute :author, :user
之后,你就可以运行之类的东西
Post.new(title: 'My beautiful story', author: User.first)