PG :: IndefinidoTable: ERROR: la relación “…” no existe

En la migración, recibo 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 de 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 siguiente error, 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 está sucediendo porque la migración de CreateOrganizations se está ejecutando antes de que se ejecute CreateActioncodes .

CreateActioncodes debe ejecutarse primero, garantizando así 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 20141014205756_add_index_to_users_email.rb ya que la marca de tiempo de la segunda – 20141014205756 es posterior a la primera – 20141014183645 .

Asegúrese de que la fecha y hora de la migración de CreateOrganizations sea ​​posterior a la migración de CreateActioncodes .

O 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.

La foreign_key: true en esta línea:

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

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

constraint especifica que los valores en 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 una lógica dentro de la base de datos (donde pertenece) lo que garantiza 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 referirse a ella. Parece que sus migraciones están intentando crear organizations antes de actioncodes modo que todo lo que necesita hacer es cambiar el nombre del archivo de migración CreateOrganizations para que su prefijo de timestamp venga después del de CreateActioncodes . El prefijo es solo una marca de tiempo con el formato AAAAMMDDhhmmss, así que cambie la marca de tiempo CreateOrganizations a la CreateActioncodes tiempo CreateActioncodes con un segundo más.

También estaba recibiendo 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.