Prima di tutto, come Jonathan Allard detto il from
e to
non sono nella fonte metodo che significa che il change_column_default
non lo accetta E 'semplicemente così:
def sum(a)
return a
end
Ora, se si tenta di passare due variabili ad esso come sum(a, b)
o qualcosa non accetterà tale diritto. Questo è quello che stai cercando di fare sopra usando from
e to
.
Ora la sintassi corretta di questo è:
change_column_default(:people, :height, 0)
Il metodo non accetta from
e to
(come viene definita come tale, anche se sono le chiavi di hash, se il metodo non fa uso quella coppia di valori chiave ovunque non è utile) e se è una nuova colonna ovviamente avrà il valore predefinito nil
(se non impostato prima) e supponiamo che la colonna height
di tipo integer
e la si assegni di default valore a
memorizzerà 0
come valore predefinito (non sicuro al 100% ma ha provato a farlo dalla console di rails). Non importa rotaiare quale sia il valore predefinito al momento, ha solo bisogno del nuovo valore predefinito. Pertanto, se il valore predefinito corrente è 0
e lo si imposta sulle rotaie nil
, non verrà presentato reclamo. È il tuo database e desideri che cosa farne. Solo se il database lo interrompe se si sta facendo qualcosa di sbagliato come l'assegnazione di string
a boolean
, allora ovviamente genererà un errore.
Ora, una volta eseguita questa migrazione, imposterà il valore predefinito su 0
, ora le rotaie non conoscono il valore predefinito precedente. Come è andato e non lo ha memorizzato da nessuna parte. Ecco perché change_column_default
è una migrazione irreversibile. E se provi a rollarlo, ti viene dato il ActiveRecord::IrreversibleMigration: ActiveRecord::IrreversibleMigration
in caso di metodo change
. Significa che quando si è utilizzato:
def change
change_column_default(:people, :height, 0)
end
Ecco perché per questo tipo di migrazioni usiamo il metodo up
e down
:
def up
change_column_default(:people, :height, 0)
end
def down
change_column_default(:people, :height, nil)
end
Spero che questo aiuti.
Potrebbe essere che Rails stia cercando di evitare un problema di coercizione tipo? – max
http://stackoverflow.com/questions/7098602/add-a-default-value-to-a-column-through-a-migration – max
Non vedo alcun parametro 'from' o' to' nella [definizione del metodo] (http://api.rubyonrails.org/classes/ActiveRecord/ConnectionA dapters/PostgreSQL/SchemaStatements.html # method-i-change_column_default) –