caa*_*os0 113 activerecord ruby-on-rails rails-migrations ruby-on-rails-3
我想migration在Rails中创建一个引用另一个表.通常,我会这样做:
add_column :post, :user, :references
Run Code Online (Sandbox Code Playgroud)
这将创建一个名为列user_id在posts表中.但是,如果,而不是user_id,我想要的东西author_id呢?我怎样才能做到这一点?
eco*_*gic 242
在Rails 4.2+中你也可以在db中设置外键,这是一个好主意.
对于简单的关联,这也可以在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"
Run Code Online (Sandbox Code Playgroud)
She*_*yar 211
如果您要定义Post模型表格,您可以设置references,index并foreign_key在一行:
t.references :author, index: true, foreign_key: { to_table: :users }
Run Code Online (Sandbox Code Playgroud)
如果要添加对现有表的引用,则可以执行以下操作:
add_reference :posts, :author, foreign_key: { to_table: :users }
Run Code Online (Sandbox Code Playgroud)
注意: 默认值为indextrue.
nat*_*vda 85
在rails 4中,当使用postgresql和schema_plus gem时,你可以写
add_reference :posts, :author, references: :users
Run Code Online (Sandbox Code Playgroud)
这将创建一个author_id正确引用的列users(id).
在你的模型中,你写
belongs_to :author, class_name: "User"
Run Code Online (Sandbox Code Playgroud)
msc*_*ltz 55
手动完成:
add_column :post, :author_id, :integer
Run Code Online (Sandbox Code Playgroud)
但现在,当你创建belongs_to语句时,你将不得不修改它,所以现在你必须调用
def post
belongs_to :user, :foreign_key => 'author_id'
end
Run Code Online (Sandbox Code Playgroud)
jes*_*199 49
如果您没有使用外键,那么另一个表的实际表名是什么并不重要.
add_reference :posts, :author
Run Code Online (Sandbox Code Playgroud)
从Rails 5开始,如果您使用的是外键,则可以在外键选项中指定其他表的名称.(有关讨论,请参阅https://github.com/rails/rails/issues/21563)
add_reference :posts, :author, foreign_key: {to_table: :users}
Run Code Online (Sandbox Code Playgroud)
在Rails 5之前,您应该将外键添加为单独的步骤:
add_foreign_key :posts, :users, column: :author_id
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
59344 次 |
| 最近记录: |