用户上传的内容很多。我想在引用uploads
的{{1}}表中添加一列。迁移应该是什么样的?
这就是我所拥有的。我不确定是否应该使用(1)user
或(2):user_id, :int
。我甚至不确定(2)是否有效。只是试图以“轨道”的方式做到这一点。
:user, :references
除了Rails 3之外的相关问题。Rails 3 migrations: Adding reference column?
答案 0 :(得分:645)
Rails 4.x
当已经 users
和uploads
表格并希望在他们之间添加新关系时。
您需要做的就是:只需使用以下命令生成迁移:
rails g migration AddUserToUploads user:references
将创建一个迁移文件:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
然后,使用rake db:migrate
运行迁移。
此迁移将负责将一个名为user_id
的新列添加到uploads
表(引用id
表中的users
列),PLUS它还将添加一个新的索引列。
更新[适用于Rails 4.2]
不能信任Rails来维护引用完整性; 关系数据库来到我们这里救援。这意味着我们可以在数据库级别本身添加外键约束,并确保数据库拒绝任何违反此设置参照完整性的操作。正如@infoget所评论的那样, Rails 4.2 附带了对外键(参照完整性)的本机支持。这不是必需的,但您可能希望将外键(因为它非常有用)添加到我们上面创建的引用中。
要将外键添加到现有引用,请创建新的迁移以添加外键:
class AddForeignKeyToUploads < ActiveRecord::Migration
def change
add_foreign_key :uploads, :users
end
end
要使用外键(在Rails 4.2中)创建一个完全全新的引用,请使用以下命令生成迁移:
rails g migration AddUserToUploads user:references
将创建一个迁移文件:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
这会将新的外键添加到user_id
表的uploads
列。该密钥引用id
表中的users
列。
注意:除了添加引用之外,您还需要先创建引用然后再创建外键(您可以选择创建外部引用键入相同的迁移或单独的迁移文件)。 Active Record仅支持单列外键,目前仅支持mysql
,mysql2
和PostgreSQL
适配器。请勿尝试使用其他适配器,例如sqlite3
等。请参阅Rails Guides: Foreign Keys以供参考。
答案 1 :(得分:161)
您仍然可以使用此命令创建迁移:
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
答案 2 :(得分:12)
如果您喜欢使用up
和down
方法的其他替代方法,请尝试以下方法:
def up
change_table :uploads do |t|
t.references :user, index: true
end
end
def down
change_table :uploads do |t|
t.remove_references :user, index: true
end
end
答案 3 :(得分:8)
[使用Rails 5]
生成迁移:
rails generate migration add_user_reference_to_uploads user:references
这将创建迁移文件:
class AddUserReferenceToUploads < ActiveRecord::Migration[5.1]
def change
add_reference :uploads, :user, foreign_key: true
end
end
现在,如果您观察架构文件,您将看到uploads表包含一个新字段。例如:t.bigint "user_id"
或t.integer "user_id"
。
迁移数据库:
rails db:migrate
答案 4 :(得分:6)
做同样事情的另一种语法是:
rails g migration AddUserToUpload user:belongs_to
答案 5 :(得分:6)
创建迁移文件
rails generate migration add_references_to_uploads user:references
默认外键名称
这将在上载表中创建一个user_id列作为外键
class AddReferencesToUploads < ActiveRecord::Migration[5.2]
def change
add_reference :uploads, :user, foreign_key: true
end
end
用户模型:
class User < ApplicationRecord
has_many :uploads
end
上传模型:
class Upload < ApplicationRecord
belongs_to :user
end
自定义外键名称:
add_reference :uploads, :author, references: :user, foreign_key: true
这将在上载表中创建一个author_id列作为外键。
用户模型:
class User < ApplicationRecord
has_many :uploads, foreign_key: 'author_id'
end
上传模型:
class Upload < ApplicationRecord
belongs_to :user
end
答案 6 :(得分:3)
如果有人遇到相同的问题,只需记录一下...
在我的情况下,我一直在使用:uuid
字段,上面的答案不适用于我的情况,因为rails 5正在使用:bigint
而不是:uuid
创建列:< / p>
add_column :uploads, :user_id, :uuid
add_index :uploads, :user_id
add_foreign_key :uploads, :users