2009-05-20 12 views
185

Ben sorun var bir sütun için varsayılan ayar geri al:Raylar göçler: Rails bir göç olduğunu, bu örnekte olduğu gibi, bir sütun için varsayılan bir ayar kurar,

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

varsayalım, ben mi Bir sonraki geçişte varsayılan ayarları bırakın, bunu ray geçişlerini kullanarak nasıl yapabilirim?

Benim şu anki geçici çözüm böyle raylar göç özel bir sql komutunun yürütülmesi şöyledir:

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

Ama temel veritabanı nasıl şimdi bağımlı çünkü ben, bu yaklaşımı sevmiyorum bu komutu yorumlamak. Veritabanının değişmesi durumunda, bu sorgu belki de artık çalışmayabilir ve göç kırılır. Yani, raylarda bir sütun için varsayılan ayarın geri alınmasının ifade edilmesinin bir yolu var mı?

cevap

375

change_column_default(table_name, column_name, nil) da tamamen sütunun varsayılan değeri düşmeye çalışır. Yürütmeyi kullanmaya gerek yok.

+7

Postgre'lerde, bu aslında 'CHARACTER VARYING' sütunları için varsayılan değeri düşürmez, sadece 'NULL :: karakterini değiştirir '. –

+7

Daha yeni sürümlerde, onu tersine çevirebilirsiniz. Örneğin: 'change_column_default (: table_name,: column_name, from: nil, to: false)' – Mark

+1

@AttilaO. "ALTER CABLE table_name ALTER COLUMN type DROP DEFAULT" 'ı çalıştıran, "NULL" olarak ayarlamaya gerek yok. –

22

Sounds ile doğru olanı yapıyoruz gibi senin docs işaret olarak, 'yürütme':

change_column_default(table_name, column_name, default) 

bir sütun için yeni bir varsayılan değeri ayarlar. varsayılan değerini NULL olarak ayarlamak isterseniz, şansınız kalmadı. DatabaseStatements # 'a uygun SQL deyimini kendiniz uygulamanız gerekir. Örnekler

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

teşekkürler! Dokümanda bu ipucunu kendim bulamadım! Gelecekte, rayların gelecekteki sürümlerinde varsayılan değerlerin bırakılmasına katkıda bulunurlar. – wulfovitch

+1

Artık Rails 3.1.0, cfr. http://apidock.com/rails/v3.1.0/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default – asymmetric

14

Ben NULL sütunları NOT NULL yapmak, ancak şema seviyesinde DEFAULT atlamak için kullanın şu pasajı:

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

Kabul edilen biri aynı durumu gösterdiğinden bu yanıtta katma değer göremiyorum. – Mosselman

+4

Bu aslında bir örnek kullanım verdiğinden beri bana yardımcı olanıdır ... – rogerdpack

-3

Raylar 4

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

Bu bir NOT NULL kısıtlaması ekler, DEFAULT – Extrapolator

+0

ile hiçbir ilgisi yok DEFAULT +1 ile ilgisi yoktur –

İlgili konular