Rayları taşıma: Bir sütun için varsayılan ayarı geri alma


190

Ben bir örnek için bir sütun için varsayılan bir ayar oluşturan Rails bir geçiş var sorun var:

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

Diyelim ki, daha sonraki bir taşıma işleminde bu varsayılan ayarları bırakmak istiyorum, bunu ray taşımalarını kullanarak nasıl yapabilirim?

Geçerli geçici çözüm, raylar geçişinde aşağıdaki gibi özel bir sql komutunun yürütülmesidir:

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

Ama bu yaklaşımı sevmiyorum, çünkü artık temel veritabanının bu komutu nasıl yorumladığına bağlıyım. Veritabanında bir değişiklik olması durumunda, bu sorgu artık çalışmayabilir ve geçiş bozulur. Peki, raylardaki bir sütun için varsayılan ayarın geri alınmasını ifade etmenin bir yolu var mı?

Yanıtlar:


387

Raylar 5+

def change
  change_column_default( :table_name, :column_name, from: nil, to: false )
end

Raylar 3 ve Raylar 4

def up
  change_column_default( :table_name, :column_name, nil )
end

def down
  change_column_default( :table_name, :column_name, false )
end

7
Postgres'te, bu aslında CHARACTER VARYINGsütunlar için varsayılanı düşürmez, sadece olarak ayarlayın NULL::character varying.
Attila O.

8
Daha yeni sürümlerde, geri döndürülebilir hale getirebilirsiniz. Örneğin: change_column_default(:table_name, :column_name, from: nil, to: false)
Mark

1
@AttilaO. Başarı elde ettim, sanırım ALTER TABLE table_name ALTER COLUMN type DROP DEFAULTbunu ayarlamaya gerek yok NULL.
Eli Rose - REINSTATE MONICA

FYI, @Mark'ın Rails 5+ 'da bahsettiği tersine çevrilebilir bir versiyona benziyor, bu yüzden bunun altındaki herhangi bir şey, onu kullanamayacaksınız.
Joshua Pinter

23

Sesler sizin gibi doğru olanı yapıyoruz 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ğer ayarlar. Varsayılan değeri NULL olarak ayarlamak istiyorsanız, şansınız kalmaz. DatabaseStatements # ile ilgili SQL deyimini kendiniz çalıştırmalısınız. Örnekler

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

Teşekkürler! Bu ipucunu dokümanda tek başıma bulamadım! Rayların gelecekteki sürümlerinde varsayılan değerlerin taşıma işlemlerine düşürülmesini sağlarlar.
wulfovitch


14

Aşağıdaki snippet'i NULLsütun oluşturmak için kullanıyorum NOT NULL, ancak DEFAULTşema düzeyinde atlıyorum :

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

Kabul edilen kişi aynı şeyi belirttiği için bu cevapta katma değer görmüyorum.
Mosselman

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.