如何定义在 Ruby on Rails 5.2 中的 ActiveRecord 迁移中创建表时使用的顺序?

use*_*081 4 postgresql activerecord ruby-on-rails rails-migrations rails-activerecord

我需要将特定的 Postgres 序列分配给表的 ID 字段。在模型中,我尝试定义以下对 Posgres 没有影响的设置:

类 MyObject < ActiveRecord::Base

self.sequence_name = "global_seq"

通常,ActiveRecord 迁移中的表定义以

create_table "objects", id: :serial, force: :cascade do |t|
Run Code Online (Sandbox Code Playgroud)

它生成列默认值的 Postgres 定义为

default nextval('objects_id_seq'::regclass)
Run Code Online (Sandbox Code Playgroud)

如何在迁移中指定 nextval() 函数应该依赖于另一个序列?

mu *_*ort 7

您可以更改迁移中的默认值:

change_column :my_objects, :id, :integer, default: -> { "nextval('global_seq')" }
Run Code Online (Sandbox Code Playgroud)

您可能想要使用:bigint而不是:integer取决于序列和表的设置方式。您必须使用 lambda 作为选项:default才能将原始nextval('global_seq')表达式存入数据库。

您可能也想删除旧的序列,据我所知,您必须使用connection.execute('drop sequence ...')它。

如果您跳过默认:id步骤,create_table那么您可以在手动创建列时完成所有操作:id

create_table :my_objects, id: false do |t|
  t.bigint :id, null: false, default: -> { "nextval('global_seq')" }
  t.primary_key :id
  ...
end
Run Code Online (Sandbox Code Playgroud)

t.bigint同样,在和 之间进行选择t.integer取决于您希望 PK 有多大。