5

Sulla migrazione ottengo il seguente messaggio di errore:PG :: UndefinedTable: ERRORE: relazione "..." non esiste

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

Ho il seguente file di migrazione per le organizzazioni:

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 

E per Actioncodes ho il file di migrazione:

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 

il file modello di organizzazione include: belongs_to :actioncode .

Mentre il file del modello actioncodes include: has_many :organizations.

Qualche idea di cosa potrebbe causare il messaggio di errore?

Se rimuovo index: true, foreign_key: true dal file di migrazione, migra senza errori. E quando sostituisco quella linea con la linea errata t.references :actioncode_id, index: true, foreign_key: true, dà l'errore sotto, dove l'ultima riga ("id") suggerisce Rails in qualche modo sembra avere problemi con il nome della tabella?

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") 
+0

Il nome della tabella è codice di azione. Ho aggiunto il suo file di migrazione al post originale – Nick

+1

Sembra che la migrazione di 'CreateOrganizations' venga eseguita prima che venga eseguito' CreateActioncodes'. - 'CreateActioncodes' deve essere eseguito per primo assicurando che esista la tabella' actioncodes'. –

+0

Potete forse consigliare come dovrei cambiare questo? Ho controllato e il codice SQL conferma effettivamente che le organizzazioni vengono create prima che Actioncodes sia. – Nick

risposta

13

Quindi il problema sta accadendo perché CreateOrganizations migrazione viene eseguito prima CreateActioncodes viene eseguito.

CreateActioncodes deve essere eseguito per primo garantendo in tal modo che la tabella action codes esista.

L'ordine in cui vengono eseguite le migrazioni si basa sul timestamp della migrazione, come indicato nel nome del file. 20141014183645_create_users.rb verrà eseguito prima dello 20141014205756_add_index_to_users_email.rb poiché il timestamp del secondo - 20141014205756 è successivo a quello del primo - 20141014183645.

Verificare che i timestamp della migrazione CreateOrganizations siano successivi alla migrazione CreateActioncodes.

O è possibile modificare manualmente il timestamp nei nomi file. O eliminare questi file di migrazione e crearli nell'ordine corretto.

+0

Questo ha funzionato! Ho usato 'rails generate migration AddActioncodeToOrganizations actioncode: references' per creare un nuovo file di migrazione per il riferimento. Rimosso il riferimento dal vecchio file di migrazione (che ho mantenuto per le altre variabili). Anche la risposta da @mu è troppo corta ovviamente, ma @Prakesh era solo un po 'prima, quindi ho accettato questa come soluzione. – Nick

+0

Grazie - qualcosa di facilmente trascurato quando si generano modelli db – Onichan

9

Il foreign_key: true in questa linea:

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

dice Rails per creare una chiave esterna all'interno del database. A foreign key:

constraint specifies that the values in a column (or a group of columns) must match the values appearing in some row of another table. We say this maintains the referential integrity between two related tables.

quindi è una logica all'interno del database (a cui appartiene), che garantisce non si può mettere i valori non validi nella colonna actioncode e che non è possibile rimuovere le voci dalla actioncodes tavolo che sono essere usato altrove.

Per creare il vincolo, la tabella di riferimento (actioncodes) deve esistere prima di fare riferimento ad essa. Sembra che le migrazioni stiano cercando di creare organizations prima del actioncodes quindi tutto ciò che devi fare è rinominare il file di migrazione CreateOrganizations in modo che il suo prefisso timestamp venga dopo quello per CreateActioncodes.Il prefisso è solo un timestamp nel formato YYYYMMDDhmmss, quindi modifica la data/ora CreateOrganizations nella data e ora CreateActioncodes con un altro secondo.

3

Ho ricevuto anche questo errore. Se si sta utilizzando un database di test per eseguire rspec, assicurarsi di eseguire [rake db:test:prepare] nel terminale prima di eseguire rspec.

Problemi correlati