在Rails 4中添加引用列迁移

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

当你已经拥有 usersuploads表并希望在它们之间添加新关系时.

您需要做的就是:只需使用以下命令生成迁移:

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_iduploads表(引用idusers表),再加上它也将在新列中添加索引.

更新[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.键引用表中的idusers.

注意:这是添加引用的补充,因此您仍然需要先创建引用然后创建外键(您可以选择在同一迁移中创建外键或单独的迁移文件).Active Record仅支持单列外键,目前仅支持mysql,mysql2并且PostgreSQL支持适配器.请勿使用其他适配器等尝试此操作sqlite3.请参阅Rails指南:外键供您参考.

  • 现在,如果您使用特殊的生成器语法进行迁移,Rails 4.2将自动创建包含外键约束的正确迁移.`rails g migration AddUserToUploads user:references`在适当的迁移中生成`add_reference:uploads,:user,index:true,foreign_key:true`. (30认同)
  • 我相信你可以在一行中完成所有工作:add_reference:uploads,:user,index:true,foreign_key:true @KirtiThorat (17认同)
  • 在许多情况下,添加外键也是很好的.[add_foreign_key](http://edgeapi.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_foreign_key)(Rails 4.2) (8认同)
  • 使用`... index:true,foreign_key:true`代替o行`add_foreign_key`. (8认同)
  • 为什么我们需要`foreign_key`和`t.reference`?不是`t.reference`基本上等同于`foriegn_key` +`index`? (2认同)

Mir*_*318 174

Rails 5

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

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

  • @Zeke是的,运行迁移并检查你的模式,它应该说像`t.index ["user_id"],名称:"index_uploads_on_user_id",使用:: btree` (4认同)
  • 这会自动添加`:index` (3认同)
  • 对于名称间隔类,比如`Local :: User`而不是`User`做类似`rails g migration AddLocalUserToUploads user:references`. (2认同)
  • 我们还应该在`Upload`类中添加`belongs_to:user`,这样我们就可以使用`upload.user`来获取用户实例. (2认同)

Kir*_*eas 16

如果你喜欢另一种替代方法updown方法试试这个:

  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)

参考:活动记录 Postgresql UUID


小智 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)


Cli*_*ton 8

创建迁移文件

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)


Nad*_*sin 7

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

rails g migration AddUserToUpload user:belongs_to
Run Code Online (Sandbox Code Playgroud)