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

时间:2014-09-12 17:24:23

标签: ruby-on-rails postgresql activerecord

我遇到了同样的问题post。但我正在使用Rails,并且不知道如何在activerecord中执行此解决方法。

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

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

当我插入另一个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"        

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

感谢。

2 个答案:

答案 0 :(得分:2)

我相信,尽管这是一种坏习惯,但很多时候,这是唯一的手段

您可以定义此方法:

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 

然后致电

fix_self_increment(DevicePlatform)

享受

答案 1 :(得分:-3)

根据评论,在种子中使用id是一种不好的做法。我正在避免不良做法,这对我来说已经足够了。更改了我的代码以避免这种情况。