Don*_*n P 294 ruby-on-rails rails-migrations ruby-on-rails-4 rails-activerecord
用户有很多上传.我想在uploads引用该表的表中添加一列user.迁移应该是什么样的?
这就是我所拥有的.我不确定是否应该使用(1):user_id, :int或(2):user, :references.我甚至不确定(2)是否有效.只是试图以"轨道"的方式做到这一点.
class AddUserToUploads < ActiveRecord::Migration
def change
add_column :uploads, :user_id, :integer
end
end
Run Code Online (Sandbox Code Playgroud)
除Rails之外的相关问题3. Rails 3迁移:添加引用列?
Kir*_*rat 671
Rails 4.x
当你已经拥有 users和uploads表并希望在它们之间添加新关系时.
您需要做的就是:只需使用以下命令生成迁移:
rails g migration AddUserToUploads user:references
Run Code Online (Sandbox Code Playgroud)
这将创建一个迁移文件:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
Run Code Online (Sandbox Code Playgroud)
然后,使用运行迁移rake db:migrate.这种迁移会照顾添加一个名为新列user_id于uploads表(引用id列users表),再加上它也将在新列中添加索引.
更新[For Rails 4.2]
不能信任Rails来维护引用完整性; 关系数据库来到我们这里救援.这意味着我们可以在数据库级别自己添加外键约束,并确保数据库拒绝任何违反此set参照完整性的操作.正如@infoget所评论的那样,Rails 4.2附带了对外键的本机支持(参照完整性).这不是必需的,但您可能希望将外键(因为它非常有用)添加到我们上面创建的引用中.
要将外键添加到现有引用,请创建新迁移以添加外键:
class AddForeignKeyToUploads < ActiveRecord::Migration
def change
add_foreign_key :uploads, :users
end
end
Run Code Online (Sandbox Code Playgroud)
要使用外键创建完全全新的引用(在Rails 4.2中),请使用以下命令生成迁移:
rails g migration AddUserToUploads user:references
Run Code Online (Sandbox Code Playgroud)
这将创建一个迁移文件:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
Run Code Online (Sandbox Code Playgroud)
这将向表的user_id列添加新的外键uploads.键引用表中的id列users.
注意:这是添加引用的补充,因此您仍然需要先创建引用然后创建外键(您可以选择在同一迁移中创建外键或单独的迁移文件).Active Record仅支持单列外键,目前仅支持mysql,mysql2并且PostgreSQL支持适配器.请勿使用其他适配器等尝试此操作sqlite3.请参阅Rails指南:外键供您参考.
Mir*_*318 174
您仍然可以使用此命令创建迁移:
rails g migration AddUserToUploads user:references
Run Code Online (Sandbox Code Playgroud)
迁移看起来与以前有点不同,但仍然有效:
class AddUserToUploads < ActiveRecord::Migration[5.0]
def change
add_reference :uploads, :user, foreign_key: true
end
end
Run Code Online (Sandbox Code Playgroud)
请注意,它:user不是:user_id
Kir*_*eas 16
如果你喜欢另一种替代方法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
Run Code Online (Sandbox Code Playgroud)
Bru*_*ali 12
只是为了记录是否有人有同样的问题......
在我的情况我一直在使用:uuid领域,上述答案没有工作,我的情况下,由于导轨5使用创建一列:bigint,而不是:uuid:
add_reference :uploads, :user, index: true, type: :uuid
Run Code Online (Sandbox Code Playgroud)
小智 9
[使用Rails 5]
生成迁移:
rails generate migration add_user_reference_to_uploads user:references
Run Code Online (Sandbox Code Playgroud)
这将创建迁移文件:
class AddUserReferenceToUploads < ActiveRecord::Migration[5.1]
def change
add_reference :uploads, :user, foreign_key: true
end
end
Run Code Online (Sandbox Code Playgroud)
现在,如果您观察架构文件,您将看到uploads表包含一个新字段.像:t.bigint "user_id"或t.integer "user_id".
迁移数据库:
rails db:migrate
Run Code Online (Sandbox Code Playgroud)
创建迁移文件
rails generate migration add_references_to_uploads user:references
Run Code Online (Sandbox Code Playgroud)
默认外键名称
这将在上传表中创建一个 user_id 列作为外键
class AddReferencesToUploads < ActiveRecord::Migration[5.2]
def change
add_reference :uploads, :user, foreign_key: true
end
end
Run Code Online (Sandbox Code Playgroud)
用户模型:
class User < ApplicationRecord
has_many :uploads
end
Run Code Online (Sandbox Code Playgroud)
上传模型:
class Upload < ApplicationRecord
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
自定义外键名称:
add_reference :uploads, :author, references: :user, foreign_key: true
Run Code Online (Sandbox Code Playgroud)
这将在上传表中创建一个 author_id 列作为外键。
用户模型:
class User < ApplicationRecord
has_many :uploads, foreign_key: 'author_id'
end
Run Code Online (Sandbox Code Playgroud)
上传模型:
class Upload < ApplicationRecord
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
做同样事情的另一种语法是:
rails g migration AddUserToUpload user:belongs_to
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
236682 次 |
| 最近记录: |