Rails + postgres 自动增量未在显式 id 插入时更新

Wil*_*ckl 4 postgresql activerecord ruby-on-rails

我和这篇文章有同样的问题。但我正在使用 Rails,不知道如何在 activerecord 中执行此解决方法。

我正在使用seeds.rb 插入一些数据:

device_platforms = DevicePlatform.create([{id: 1, name: 'Android'}, {id: 2, name: 'IOS'}, {id: 3, name: 'Windows Phone'}])
Run Code Online (Sandbox Code Playgroud)

当我插入另一个 DevicePlatform 时,出现此异常:

Failure/Error: @device_platform = FactoryGirl.create(:device_platform)
 ActiveRecord::RecordNotUnique:
   PG::UniqueViolation: ERRO:  duplicar valor da chave viola a restrição de unicidade "device_platforms_pkey"                                                                 
   DETAIL:  Chave (id)=(2) já existe.
   : INSERT INTO "device_platforms" ("created_at", "name", "updated_at") VALUES ($1, $2, $3) RETURNING "id"        
Run Code Online (Sandbox Code Playgroud)

该消息是葡萄牙语,表示具有该 ID 的行已经存在。

谢谢。

obe*_*nda 6

我相信虽然这是一个坏习惯,但很多时候它是唯一的手段

您可以定义此方法:

def fix_self_increment(model)
  ActiveRecord::Base.connection.execute(
    "BEGIN; " \
    "LOCK TABLE #{model.table_name} IN EXCLUSIVE MODE; " \
    "SELECT setval('#{model.table_name}_id_seq', COALESCE((SELECT MAX(id)+1 FROM #{model.table_name}), 1), false); " \
    "COMMIT;"
  )
end 
Run Code Online (Sandbox Code Playgroud)

然后打电话

fix_self_increment(DevicePlatform)
Run Code Online (Sandbox Code Playgroud)

享受