在Rails 4中添加参考列迁移

用户上传次数过多。我想在uploads表中添加一列,该列引用user. xml表。迁移应该是什么样的?

这是我有的。我不确定我是否应该使用(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迁移:添加参考列?

370710 次浏览

Rails 4.倍

当你已经有 usersuploads表,并希望在它们之间添加一个新关系

你所需要做的就是:使用下面的命令生成一个迁移:

rails g migration AddUserToUploads user:references

这将创建一个迁移文件:

class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end

然后,使用rake db:migrate运行迁移。 此迁移将负责向uploads表添加一个名为user_id的新列(引用users表中的id列),此外,它还将在新列上添加一个索引

更新[针对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

这将为uploads表的user_id列添加一个新的外键。键引用users表中的id列。

这是在添加引用之外,所以你仍然需要先创建引用,再创建外键 (您可以选择在同一个迁移或单独的迁移文件中创建外键)。活动记录只支持单列外键,目前只支持mysqlmysql2PostgreSQL适配器。不要尝试使用其他适配器,如sqlite3等。参考Rails指南:外键

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

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

rails g migration AddUserToUpload user:belongs_to

[使用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

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

只是为了记录下是否有人有同样的问题……

在我的情况下,我一直在使用:uuid字段,上面的答案并不适用于我的情况,因为rails 5正在使用:bigint而不是:uuid创建一个列:

add_reference :uploads, :user, index: true, type: :uuid

参考:Active Record Postgresql的UUID

创建一个迁移文件

rails generate migration add_references_to_uploads user:references

默认外键名称

这将在uploads表中创建一个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
class MigrationName < ActiveRecord::Migration[7.0]
disable_ddl_transaction!
  

def change
add_reference :uploads, :user, index: {algorithm: :concurrently}
end
end