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

这是我有的。我不确定我是否应该使用(1):user_id,:int或(2):user,:引用。我甚至不确定(2)是否有效。我只是想按"铁轨"的方式来。

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_column :uploads, :user_id, :integer
  end
end

除了Rails 3之外的相关问题。Rails 3迁移:添加参考列?


当前回答

class MigrationName < ActiveRecord::Migration[7.0]
  disable_ddl_transaction!
  
  def change
    add_reference :uploads, :user, index: {algorithm: :concurrently}
  end
end

其他回答

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

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

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

参考:Active Record Postgresql UUID

如果你喜欢另一种向上和向下的方法,试试这个:

  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

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

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

rails g migration AddUserToUpload user:belongs_to

创建一个迁移文件

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