run remove rails migrations data create column ruby-on-rails postgresql ruby-on-rails-4 rails-migrations

ruby-on-rails - remove - rollback migration rails



PG:: UndefinedTable: ERROR: la relaciĆ³n "..." no existe (3)

En la migración me sale el siguiente mensaje de error:

PG::UndefinedTable: ERROR: relation "actioncodes" does not exist : ALTER TABLE "organizations" ADD CONSTRAINT "fk_rails_4ecaa2493e" FOREIGN KEY ("actioncode_id") REFERENCES "actioncodes" ("id")

Tengo el siguiente archivo de migración para Organizaciones:

class CreateOrganizations < ActiveRecord::Migration def change create_table :organizations do |t| t.string :name, null: false, limit: 40 t.references :actioncode, index: true, foreign_key: true t.boolean :activated t.datetime :activated_at t.timestamps null: false end end end

Y para Actioncodes tengo el archivo de migración:

class CreateActioncodes < ActiveRecord::Migration def change create_table :actioncodes do |t| t.string :code, null: false, limit: 20 t.string :description, limit: 255 t.timestamps null: false end end end class AddIndexToActioncodesCode < ActiveRecord::Migration def change add_index :actioncodes, :code, unique: true end end

El archivo del modelo de organización incluye: belongs_to :actioncode .

Mientras que el archivo de modelo de códigos de acción incluye: has_many :organizations .

¿Alguna idea de lo que podría estar causando el mensaje de error?

Si index: true, foreign_key: true del archivo de migración, migra sin errores. Y cuando reemplazo esa línea con la línea incorrecta t.references :actioncode_id, index: true, foreign_key: true , da el error a continuación, donde la última línea ("ids") sugiere que Rails de alguna manera parece tener problemas con el nombre de ¿la mesa?

PG::UndefinedTable: ERROR: relation "actioncode_ids" does not exist : ALTER TABLE "organizations" ADD CONSTRAINT "fk_rails_604f95d1a1" FOREIGN KEY ("actioncode_id_id") REFERENCES "actioncode_ids" ("id")


Entonces, el problema ocurre porque la migración de CreateOrganizations se está ejecutando antes de que se ejecute CreateActioncodes .

CreateActioncodes debe ejecutarse primero para garantizar que exista la tabla de action codes .

El orden en que se ejecutan las migraciones se basa en la marca de tiempo de la migración, como se indica en el nombre del archivo. 20141014183645_create_users.rb se ejecutará antes de 20141014205756_add_index_to_users_email.rb ya que la marca de tiempo del segundo - 20141014205756 es posterior a la del primero - 20141014183645 .

Asegúrese de que las CreateOrganizations tiempo de la migración CreateOrganizations sean posteriores a las de la migración CreateActioncodes .

O bien, puede cambiar manualmente la marca de tiempo en los nombres de archivo. O elimine estos archivos de migración y créelos en el orden correcto.


También recibí este error. Si está utilizando una base de datos de prueba para ejecutar rspec, asegúrese de ejecutar rake db:test:prepare en el terminal antes de ejecutar rspec.


foreign_key: true en esta línea:

t.references :actioncode, index: true, foreign_key: true

le dice a Rails que cree una clave foránea dentro de la base de datos. Una clave foránea :

La restricción especifica que los valores de una columna (o un grupo de columnas) deben coincidir con los valores que aparecen en alguna fila de otra tabla. Decimos que esto mantiene la integridad referencial entre dos tablas relacionadas.

Por lo tanto, es algo de lógica dentro de la base de datos (donde pertenece) lo que asegura que no puede poner valores no válidos en su columna de actioncode y que no puede eliminar entradas de la tabla de actioncodes que se están utilizando en otros lugares.

Para crear la restricción, la tabla referenciada ( actioncodes ) debe existir antes de que se refiera a ella. Parece que sus migraciones están tratando de crear organizations antes de los actioncodes por lo que todo lo que necesita hacer es cambiar el nombre del archivo de migración CreateOrganizations para que su prefijo de marca de tiempo venga después del de CreateActioncodes . El prefijo es solo una marca de tiempo en el formato AAAAMMDDhhmmss, así que cambie la marca de tiempo de CreateOrganizations a la CreateActioncodes tiempo de CreateActioncodes con un segundo más.