Creo un nuevo registro así:
truck = Truck.create(:name=>name, :user_id=>2)
Mi base de datos tiene actualmente varios miles de entidades para camiones, pero asigné las identificaciones a varias de ellas, de una manera que dejó algunas identificaciones disponibles. Entonces, lo que está sucediendo es que los rieles crean un elemento con id = 150 y funciona bien. Pero luego intenta crear un elemento y asignarle id = 151, pero es posible que ese id ya exista, así que veo 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á el id 152, que funcionará bien si ese valor aún no se ha tomado. ¿Cómo puedo hacer que los rieles comprueben si ya existe un ID antes de que lo asigne?
¡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 y dejar que los rieles asignen automáticamente cada identificación esta vez. Empiezo 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 externa en muchas otras tablas. ¿Habría una manera sencilla de que rieles crearan una nueva tabla con los mismos datos que ya están almacenados en Truck, con ID asignados automáticamente y manteniendo todas las relaciones existentes?
Respuestas:
Probablemente Rails esté usando la secuencia incorporada de PostgreSQL. La idea de una secuencia es que solo se usa una vez.
La solución más simple es establecer la secuencia de la columna company.id en el valor más alto de la tabla con una consulta como esta:
Supongo que el nombre de la secuencia "company_id_seq", el nombre de la tabla "empresa" y el nombre de la columna "id" ... reemplácelos por los correctos. Puede obtener el nombre de la secuencia con
SELECT pg_get_serial_sequence('tablename', 'columname');
o mirar 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 configurar manualmente la identificación de la empresa para las nuevas filas antes de guardar.
fuente
create table t (id serial not null primary key); insert into t values (1); insert into t values (default); ERROR: duplicate key value violates unique constraint "t_pkey" DETAIL: Key (id)=(1) already exists.
Hice esto que me resolvió el problema.
¡Encontré el reset_pk_sequence! de este hilo. http://www.ruby-forum.com/topic/64428
fuente
ActiveRecord::Base.connection.tables.each { |t| ActiveRecord::Base.connection.reset_pk_sequence!(t) }
Basado en la respuesta de @Apie .
Puede realizar una tarea y ejecutarla cuando lo necesite con:
Creas tareas como esta:
Y en el archivo generado (
lib/tasks/database.rake
) poner:fuente
Me suena a un problema de base de datos y no a un problema de Rails. ¿Es posible que su base de datos tenga una semilla de identidad incorrecta en su
id
columna? Para probar, intente hacer un par de inserciones directamente en su base de datos y vea si existe el mismo comportamiento.fuente
Resolví este problema siguiendo el comando.
Ejecuta esto en tu consola de rieles
fuente