Mentre la risposta accettata è eccellente, volevo aggiungere qui una risposta che, si spera, affronti meglio la domanda di poster originale parte 2, per non esperti come me.
- How do I create a migration to replace the type of that column
generare migrazione impalcatura
È possibile generare una migrazione per contenere la modifica digitando la console (basta sostituire il table
per il nome tavoli, e column
per voi nome di colonna)
rails generate migrate change_table_column
Ciò genererà la migrazione di scheletro all'interno dell'applicazione Rails/db/migrate/folder. Questa migrazione è un segnaposto per il tuo codice di migrazione.
Per esempio voglio creare una migrazione per cambiare il tipo di una colonna string
-text
, in una tabella chiamata TodoItems:
class ChangeTodoItemsDescription < ActiveRecord::Migration
def change
# enter code here
change_column :todo_items, :description, :text
end
end
Esecuzione della migrazione
Una volta che hai inserito il codice per cambiare la colonna appena eseguita:
rake db:migrate
Per applicare i tuoi migrati sopra. Se si commette un errore è sempre possibile annullare la modifica con:
rake db:rollack
Su e Giù metodi
i riferimenti risposta accettata Up
e Down
metodi, invece del metodo più recente Change
. Poiché le guide 3.2vecchio stile, i metodi su e giù hanno presentato alcuni vantaggi rispetto al metodo di modifica più recente. 'Su e Giù' evita ActiveRecord::IrreversibleMigration exception
. Dopo il rilascio di Rails 4 è possibile utilizzare reversible
per evitare questo errore:
class ChangeProductsPrice < ActiveRecord::Migration
def change
reversible do |dir|
change_table :products do |t|
dir.up { t.change :price, :string }
dir.down { t.change :price, :integer }
end
end
end
end
Godetevi Rails :)
Grande risposta. Una nota: attualmente Rails non supporta change_column con il metodo di modifica (http://guides.rubyonrails.org/migrations.html#using-the-change-method); se la memoria serve, creerai una migrazione irreversibile se lo fai. Meglio fare il vecchio modo con i metodi su/giù. – poetmountain
@BourbonJockey: è logico che 'change' non sia in grado di invertire automaticamente una modifica del tipo e la [Guida alla migrazione] (http://guides.rubyonrails.org/migrations.html#anatomy-of-a- migrazione) dice che "[il metodo di modifica] Questo metodo è preferito per la scrittura di migrazioni costruttive (aggiungendo colonne o tabelle)" e 'change_column' non è nella lista in cui punti, quindi penso che tu abbia ragione. L'ho corretto per usare 'up' /' down' (con un avvertimento su 'down'), grazie per l'heads up. –
Per il futuro riferimento di altri lettori, la conversione da stringa a testo in Postgres su Heroku in questo modo NON perderà i dati. –