rails proyecto postgres new myapp digitalocean datos crear conectar con ruby-on-rails ruby-on-rails-3 postgresql

ruby-on-rails - proyecto - rails new myapp postgresql



Rieles que asignan automáticamente el ID que ya existe (4)

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 rieles 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 rieles 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?


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


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


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.


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.