Rieles que asignan automáticamente el ID que ya existe

Creo un nuevo registro como ese:

truck = Truck.create(:name=>name, :user_id=>2)

Mi base de datos actualmente tiene varios miles de entidades para camiones, pero asigné los identificadores a varios de ellos, de una manera que dejó algunos identificadores disponibles. Entonces, lo que está sucediendo es que Rails crea un elemento con id = 150 y funciona bien. Pero luego intenta crear un elemento y asignarlo id = 151, pero ese ID puede existir ya, así que estoy viendo este error:

ActiveRecord::RecordNotUnique (PG::Error: ERROR: duplicate key value violates unique constraint "companies_pkey" DETAIL: Key (id)=(151) already exists.

Y la próxima vez que ejecute la acción, simplemente asignará la identificación 152, que funcionará bien si ese valor no está ya tomado. ¿Cómo puedo obtener los Rails para verificar si ya existe una ID antes de asignarla?

¡Gracias!

EDITAR

La identificación del camión es lo que se está duplicando. El usuario ya existe y es una constante en este caso. En realidad, es un problema heredado con el que tengo que lidiar. Una opción es volver a crear la tabla en let rails auto assign every id esta vez. Estoy empezando a pensar que esta puede ser la mejor opción porque tengo algunos otros problemas, pero la migración para hacer esto sería muy complicada porque Truck es una clave foránea en muchas otras tablas. ¿Habría una manera simple de hacer que los Rails crearan una nueva tabla con los mismos datos que ya estaban almacenados en Camión, con identificaciones asignadas automáticamente y manteniendo todas las relaciones existentes?

Rails probablemente esté usando la secuencia PostgreSQL incorporada. La idea de una secuencia es que solo se usa una vez.

La solución más simple es establecer la secuencia para su columna company.id al valor más alto en la tabla con una consulta como esta:

 SELECT setval('company_id_seq', (SELECT max(id) FROM company)); 

Estoy adivinando su nombre de secuencia “company_id_seq”, el nombre de la tabla “company” y el nombre de la columna “id” … reemplácelos con los correctos. Puede obtener el nombre de la secuencia con SELECT pg_get_serial_sequence('tablename', 'columname'); o mire la definición de la tabla con \d tablename .

Una solución alternativa es anular el método save () en la clase de su empresa para establecer manualmente el ID de la empresa para nuevas filas antes de guardar.

Hice esto que resolvió el problema para mí.

 ActiveRecord::Base.connection.tables.each do |t| ActiveRecord::Base.connection.reset_pk_sequence!(t) end 

¡Encontré el reset_pk_sequence! de este hilo. http://www.ruby-forum.com/topic/64428

Basado en @Apie answer .

Puede realizar una tarea y ejecutarla cuando lo necesite con:

 rake database:correction_seq_id 

Usted crea tareas como esta:

 rails g task database correction_seq_id 

Y en el archivo generado ( lib/tasks/database.rake ) pon:

 namespace :database do desc "Correction of sequences id" task correction_seq_id: :environment do ActiveRecord::Base.connection.tables.each do |t| ActiveRecord::Base.connection.reset_pk_sequence!(t) end end end 

Me parece un problema de base de datos y no un problema de Rails. ¿Es posible que su base de datos tenga una semilla de identidad incorrecta en su columna de id ? Para probar intente hacer un par de insertos directamente en su base de datos y ver si existe el mismo comportamiento.