在Rails 4中添加引用列迁移

时间:2014-04-02 14:43:36

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord rails-migrations

用户上传的内容很多。我想在引用uploads的{​​{1}}表中添加一列。迁移应该是什么样的?

这就是我所拥有的。我不确定是否应该使用(1)user或(2):user_id, :int。我甚至不确定(2)是否有效。只是试图以“轨道”的方式做到这一点。

:user, :references

除了Rails 3之外的相关问题。Rails 3 migrations: Adding reference column?

7 个答案:

答案 0 :(得分:645)

Rails 4.x

已经 usersuploads表格并希望在他们之间添加新关系时。

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

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仅支持单列外键,目前仅支持mysqlmysql2PostgreSQL适配器。请勿尝试使用其他适配器,例如sqlite3等。请参阅Rails Guides: Foreign Keys以供参考。

答案 1 :(得分:161)

Rails 5

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

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)

如果您喜欢使用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

答案 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