在“引用”迁移中指定列名称

我想在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模型表,则可以在一行中设置referencesindexforeign_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)