Cuando se cargan datos desde el seeds en rails y se ingresan claves primarias manualmente quedaremos en un problema donde no podremos ingresar nuevos elementos, obtendremos un error del tipo:
[symple_box color=»red» fade_in=»false» float=»center» text_align=»center» width=»»]
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint «campaigns_pkey» DETAIL: Key (id)=(1) already exists. : INSERT INTO «campaigns» («company_id», «created_at», «updated_at») VALUES ($1, $2, $3) RETURNING «id»
[/symple_box]
Esto se debe a que cuando ingresamos valores manualmente el valor de la secuencia autoincremental no se incrementa, y luego caemos en la posibilidad de que al ingresar un dato el valor entregado por el secuenciador ya se encuentre en la base de datos causando un error de duplicidad de clave primaria.
Resolviendo el problema de las claves primarias
La forma de resolver esto consiste en resetear los valores de los secuenciadores a los ids del último registro de cada tabla, y de esta forma que sea imposible que se genere una clave primaria duplicada.
ActiveRecord::Base.connection.tables.each do |table| if table != "schema_migrations" result = ActiveRecord::Base.connection .execute("SELECT id FROM #{table} ORDER BY id DESC LIMIT 1") ai_val = result.first['id'].to_i + 1 puts "Resetting auto increment ID for #{table} to #{ai_val}" ActiveRecord::Base.connection .execute("ALTER SEQUENCE #{table}_id_seq RESTART WITH #{ai_val}") end end