2009-05-20 13 views
185

ho il problema, che ho un migrazione Rails che imposta un valore predefinito per una colonna, come in questo esempio:Rotaie migrazioni: Ripristino impostazione predefinita per una colonna

def self.up 
    add_column :column_name, :bought_at, :datetime, :default => Time.now 
end 

Supponiamo, mi piace eliminare le impostazioni predefinite in una migrazione successiva, come faccio a utilizzare le migrazioni dei binari?

mia soluzione attuale è l'esecuzione di un comando SQL personalizzata nella migrazione rotaie, in questo modo:

def self.up 
    execute 'alter table column_name alter bought_at drop default' 
end 

Ma non mi piace questo approccio, perché io sono ora dipende da come il database sottostante è interpretare questo comando. In caso di modifica del database, questa query potrebbe non funzionare più e la migrazione verrebbe interrotta. Quindi, c'è un modo per esprimere l'annullamento di un'impostazione predefinita per una colonna nei binari?

risposta

375

change_column_default(table_name, column_name, nil) funziona anche far cadere il valore di default della colonna del tutto. Non c'è bisogno di usare execute.

+7

In postgres, questo in realtà non farà cadere il default per le colonne 'CHARACTER VARYING', basta impostarlo su' NULL :: carattere che varia '. –

+7

Nelle versioni più recenti, è possibile renderlo reversibile. Ad esempio: 'change_column_default (: table_name,: column_name, from: nil, to: false)' – Mark

+1

@AttilaO. Ho avuto successo eseguendo 'ALTER TABLE nome_tabella ALTER COLUMN tipo DROP DEFAULT', non c'è bisogno di impostarlo su' NULL', penso. –

22

Sounds come si sta facendo la cosa giusta con il vostro 'eseguire', come la documentazione sottolineano:

change_column_default(table_name, column_name, default) 

stabilisce un nuovo valore predefinito per una colonna. Se si desidera impostare il valore predefinito su NULL, si è sfortunati. È necessario in DatabaseStatements # eseguire direttamente l'istruzione SQL appropriata . Esempi

change_column_default(:suppliers, :qualification, 'new') 
change_column_default(:accounts, :authorized, 1) 
+0

Grazie! Non ho trovato questo suggerimento nei documenti da solo! Hopefull costruiscono il calo dei valori di default nelle migrazioni nelle versioni future dei binari. – wulfovitch

+1

Questo non è più vero a partire da Rails 3.1.0, cfr. http://apidock.com/rails/v3.1.0/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default – asymmetric

14

il seguente frammento che utilizzo per fare NULL colonne NOT NULL, ma saltare DEFAULT a livello di schema:

def self.up 
    change_column :table, :column, :string, :null => false, :default => "" 
    change_column_default(:table, :column, nil) 
end 
+0

Non vedo il valore aggiunto in questa risposta poiché l'accettato afferma lo stesso. – Mosselman

+4

questo è quello che mi ha aiutato di più dal momento che ha fornito un esempio di utilizzo ... – rogerdpack

-3

Rails 4

change_column :courses, :name, :string, limit: 100, null: false 
+10

Questo aggiunge il vincolo NOT NULL, non ha nulla a che fare con DEFAULT – Extrapolator

+0

non ha nulla a che fare con DEFAULT +1 –

Problemi correlati