Come si aggiunge un valore predefinito a una colonna già esistente tramite una migrazione?
Tutta la documentazione che posso trovare ti mostra come fare se la colonna non esiste già ma in questo caso sì.
Risposte:
Ecco come dovresti farlo:
change_column :users, :admin, :boolean, :default => false
Ma alcuni database, come PostgreSQL, non aggiorneranno il campo per le righe create in precedenza, quindi assicurati di aggiornare manualmente il campo anche durante la migrazione.
change_column_default :employees, :foreign, false
from:e to:se si desidera che sia reversibile :)
fromed è tostato aggiunto in Rails 5+ in questo commit: github.com/rails/rails/pull/20018/files
Per Rails 4+ , usachange_column_default
def change
change_column_default :table, :column, value
end
def change `add_column: foos,: name, default:" qualcosa per i valori esistenti "` `change_column_default: end
change_column_default :products, :approved, from: true, to: false- ma anche non funziona.
Usare def changesignifica che dovresti scrivere migrazioni reversibili. E change_columnnon è reversibile. Puoi salire ma non puoi scendere, poiché change_columnè irreversibile.
Invece, sebbene possano essere un paio di righe in più, dovresti usare def upedef down
Quindi, se hai una colonna senza valore predefinito, dovresti farlo per aggiungere un valore predefinito.
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: nil
end
O se desideri modificare il valore predefinito per una colonna esistente.
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: true
end
A partire da Rails 4 non è possibile generare una migrazione per aggiungere una colonna a una tabella con un valore predefinito, i passaggi seguenti aggiungono una nuova colonna a una tabella esistente con valore predefinito true o false.
$ rails generate migration add_columnname_to_tablename columnname:boolean
Il comando precedente aggiungerà una nuova colonna nella tabella.
class AddColumnnameToTablename < ActiveRecord::Migration
def change
add_column :table_name, :column_name, :boolean, default: false
end
end
$ rake db:migrate
Eseguire:
rails generate migration add_column_to_table column:boolean
Genererà questa migrazione:
class AddColumnToTable < ActiveRecord::Migration
def change
add_column :table, :column, :boolean
end
end
Imposta il valore predefinito aggiungendo: default => 1
add_column: table,: column,: boolean,: default => 1
Correre:
rake db: migrate
Key is not present in table error.
Questo è quello che puoi fare:
class Profile < ActiveRecord::Base
before_save :set_default_val
def set_default_val
self.send_updates = 'val' unless self.send_updates
end
end
EDIT: ... ma a quanto pare questo è un errore Rookie!
before_save
upblocco anziché in unchangeblocco. Puoi lasciare ildownblocco vuoto. Non ripristinerà la tabella alla condizione originale ma la migrazione può essere annullata.