2013-04-17 14 views
8

Mi sembra strano per me, che la creazione di modelli, in esecuzione della migrazione, distruggendolo, e la creazione di nuovo stesso modello di rapporti di eccezione SQL:Rimuovere rotaie modello dopo la migrazione

project|master ⇒ rails g model name name 
     invoke active_record 
     create db/migrate/20130417185814_create_names.rb 
     create app/models/name.rb 
project|master⚡ ⇒ rake db:migrate 
== CreateNames: migrating ==================================================== 
-- create_table(:names) 
    -> 0.0020s 
== CreateNames: migrated (0.0021s) =========================================== 
project|master⚡ ⇒ rails d model name 
     invoke active_record 
     remove db/migrate/20130417185814_create_names.rb 
     remove app/models/name.rb 
project|master⚡ ⇒ rake db:migrate 
project|master⚡ ⇒ rails g model name test 
     invoke active_record 
     create db/migrate/20130417185845_create_names.rb 
     create app/models/name.rb 
project|master⚡ ⇒ rake db:migrate 
== CreateNames: migrating ==================================================== 
-- create_table(:names) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

SQLite3::SQLException: table "names" already exists: CREATE TABLE "names" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "test" varchar(255), "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) /path/project/db/migrate/20130417185845_create_names.rb:3:in `change' 
-- create_table("names", {:force=>true}) 
    -> 0.0100s 
-- initialize_schema_migrations_table() 
    -> 0.0025s 
-- assume_migrated_upto_version(20130417185814, ["/path/project/db/migrate"]) 
    -> 0.0010s 
You have 1 pending migrations: 
    20130417185845 CreateNames 
Run `rake db:migrate` to update your database then try again. 

Forse, facendo qualcosa di sbagliato? La migrazione ha il codice per l'eliminazione della tabella: può essere utilizzata solo per il rollback?

Soluzione

Elimina modello e il database tavolo e generare uno nuovo è abbastanza facile:

  1. Crea modello: rails g model user name
  2. fare migrazioni: rake db:migrate
  3. implementare qualcosa, improvvisamente ricordare che si è necessario eliminare il modello
  4. Migrazione specifica di Revert: rake db:migrate:down VERSION=20130417185814, dove 20130417185814 è la migrazione id (può essere visto in rake db: migrate: Stato)
  5. Rimuovere il modello: rails d model user
  6. ricordate improvvisamente che avete bisogno di questo modello, ma con gli altri campi
  7. Crea modello: rails g model user email group:references
  8. eseguire correttamente la migrazione database: rake db:migrate

risposta

9
rails d model name 

Questo elimina solo il modello e non la migrazione eseguita (che ha creato la tabella nel database).

Se si desidera eliminare sia il modello e le tabelle, dovrete effettuare le seguenti operazioni

rake db:rollback 
rails d model name 
+0

Ma cosa succede se creo il modello non nell'ultima migrazione? Devo eseguire il rollback di tutte le migrazioni dopo di esso? Sembra strano – Drakmail

+0

'rake db: migrate: down VERSION = 20130417185845' è ciò di cui ho bisogno. Grazie :) – Drakmail

4

Si è eliminato il modello – che è un'operazione diversa rispetto al rollback di una migrazione.

Distruggere un modello fa esattamente e solo quello; non ha nulla a che fare con le migrazioni.

+0

Vuol ho bisogno di creare la migrazione separato per l'eliminazione di tabella? – Drakmail

+0

@DRakmail perché non era nella tua versione originale? –

+0

Perché quello originale è stato cancellato da binari modello d Modello Model :) Ma tu mi hai dato un'idea. Ora vedo questo flusso di lavoro: 1. Creare modello 2. Migrate 3. 'rake db: migrate: down VERSION = 20130417185845', dove 20.130.417,185845 millions è la versione migrazione 4. modello Elimina (' rotaie d modello ModelName ') 5. Ora posso ancora creare un modello con lo stesso nome In questo modo è giusto? – Drakmail

0

secondo il vostro errore di migrazione ci deve essere qualcosa di sbagliato con i file di migrazione, inoltre quella che si riferisce per creare la tabella dei nomi.

si prega di guardare questo file, al vostro metodo di cambiamento.

il metodo di modifica in un file di migrazione deve eseguire un codice DB, che il codice DB può eseguire alcune operazioni sul DB e che lo stesso codice sulla modifica dovrebbe essere corretto per eseguire il rollback.

se si desidera separare tra i due, è necessario inserire il codice nel metodo su che eseguirà operazioni sul DB e nel metodo giù le operazioni di scorrimento opposte.

Suggerisco di cancellare tutti i file sulla migrazione incluso quello che causa il problema e di scriverli correttamente.

se hai bisogno di aiuto per favore pubblica il tuo file di migrazione.

si prega anche dare un'occhiata alle guide: http://guides.rubyonrails.org/migrations.html

+0

io non modificare ogni migrazioni - si può provare ad eseguire questi comandi: 'rotaie nome g modello name' ' rake db: migrate' 'rotaie d modello name' ' rake db: migrate' 'rails g nome modello test' ' rake db: migrate' E vedere il mio risultato. – Drakmail

Problemi correlati