在“引用”迁移中指定列名称
我想在Rails中进行migration
,引用另一个表。 通常,我会做这样的事情:
add_column :post, :user, :references
这将在posts
表中创build一个名为user_id
的列。 但是,如果,而不是user_id
,我想要的东西像author_id
? 我怎样才能做到这一点?
手动操作:
add_column :post, :author_id, :integer
但现在,当你创buildbelongs_to语句时,你将不得不修改它,所以现在你必须打电话
def post belongs_to :user, :foreign_key => 'author_id' end
在Rails 4.2中,你也可以在db中设置外键 , 这是个好主意 。
对于简单的关联,也可以在t.references
添加foreign_key: true
,但是在这种情况下,你需要两行。
# The migration add_reference :posts, :author, references: :users, index: true add_foreign_key :posts, :users, column: :author_id # The model belongs_to :author, class_name: "User"
在rails 4中,当使用postgresql和schema_plus gem时,你可以直接写
add_reference :posts, :author, references: :users
这将创build一个专栏author_id
,正确地引用users(id)
。
在你的模型中,你写
belongs_to :author, class_name: "User"
对于Rails 5+
初始定义:
如果您正在定义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
的默认值是true。
如果您没有使用外键,那么无论其他表的实际表名是什么。
add_reference :posts, :author
从Rails 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,old_name)非常方便。 只要创build你的模型和关系:
rails g model Post title user:references
然后编辑模型并添加一个属性别名
alias_attribute :author, :user
之后,你将能够运行类似的东西
Post.new(title: 'My beautiful story', author: User.first)