在Rails 4中添加参考列迁移

用户有很多上传。 我想添加一个列到引用useruploads表。 迁移应该是什么样子?

这是我的。 我不知道是否应该使用(1) :user_id, :int或(2) :user, :references 。 我甚至不确定(2)是否有效。 只是试图做这个“铁轨”的方式。

 class AddUserToUploads < ActiveRecord::Migration def change add_column :uploads, :user_id, :integer end end 

除Rails之外的相关问题3. Rails 3迁移:添加引用列?

Rails 4.x

当你已经有 usersuploads表格,并希望在他们之间添加一个新的关系

所有你需要做的是:使用下面的命令生成一个迁移:

 rails g migration AddUserToUploads user:references 

这将创build一个迁移文件为:

 class AddUserToUploads < ActiveRecord::Migration def change add_reference :uploads, :user, index: true end end 

然后,使用rake db:migrate运行rake db:migrate 。 此迁移将负责添加名为user_id的新列以上uploads表(在users表中引用id列),PLUS还会在新列上添加一个索引。

更新[对于Rails 4.2]

Rails不能被信任保持参照完整性; 关系数据库来到我们这里救援。 这意味着我们可以在数据库级别本身添加外键约束,并确保数据库将拒绝任何违反此设置参照完整性的操作。 正如@infoget所评论的那样, Rails 4.2附带了对外键的本地支持(引用完整性) 。 这不是必需的,但是您可能想要添加外键(因为它非常有用)到我们上面创build的引用。

要将外键添加到现有的引用 ,请创build新的迁移以添加外键:

 class AddForeignKeyToUploads < ActiveRecord::Migration def change add_foreign_key :uploads, :users end end 

使用外键(在Rails 4.2中)创build一个全新的引用,请使用以下命令生成一个迁移:

 rails g migration AddUserToUploads user:references 

这将创build一个迁移文件为:

 class AddUserToUploads < ActiveRecord::Migration def change add_reference :uploads, :user, index: true add_foreign_key :uploads, :users end end 

这将为uploads表的user_id列添加一个新的外键。 该键引用users表中的id列。

注意:除了添加引用之外,您还需要先创build引用,然后再创build外键可以select在同一个迁移或单独的迁移文件中创build外键 )。 Active Record只支持单列外键,目前只支持mysqlmysql2PostgreSQL适配器。 不要尝试与其他适配器,如sqlite3等,请参阅Rails指南:外键供您参考。

Rails 5

您仍然可以使用此命令来创build迁移:

 rails g migration AddUserToUploads user:references 

迁移看起来有点不同,但仍然有效:

 class AddUserToUploads < ActiveRecord::Migration[5.0] def change add_reference :uploads, :user, foreign_key: true end end 

请注意,它是:user ,而不是:user_id

做同样事情的另一种语法是:

 rails g migration AddUserToUpload user:belongs_to 

[使用Rails 5]

生成迁移:

 rails generate migration add_user_reference_to_uploads user:references 

这将创build迁移文件:

 class AddUserReferenceToUploads < ActiveRecord::Migration[5.1] def change add_reference :uploads, :user, foreign_key: true end end 

现在,如果您观察架构文件,您将看到上传表包含一个新的字段。 例如: t.bigint "user_id"t.integer "user_id"

迁移数据库:

 rails db:migrate