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 :)
from
ed è to
stato 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 change
significa che dovresti scrivere migrazioni reversibili. E change_column
non è reversibile. Puoi salire ma non puoi scendere, poiché change_column
è irreversibile.
Invece, sebbene possano essere un paio di righe in più, dovresti usare def up
edef 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
up
blocco anziché in unchange
blocco. Puoi lasciare ildown
blocco vuoto. Non ripristinerà la tabella alla condizione originale ma la migrazione può essere annullata.