在Rails 4中添加参考列迁移
用户有很多上传。 我想添加一个列到引用user
的uploads
表。 迁移应该是什么样子?
这是我的。 我不知道是否应该使用(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
当你已经有 users
和uploads
表格,并希望在他们之间添加一个新的关系 。
所有你需要做的是:使用下面的命令生成一个迁移:
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只支持单列外键,目前只支持mysql
, mysql2
和PostgreSQL
适配器。 不要尝试与其他适配器,如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