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.