2009-10-29 20 views
53

Göçlerimde böyle bir şey yapıyorum: Raylar Göçler: Varlığı Kontrol Et ve Devam Etme?

add_column :statuses, :hold_reason, :string rescue puts "column already added" 

ancak bu, 'ü SQLite için çalışırken, PostgreSQL için çalışmıyor. Add_column esiyorsa, istisnası yakalansa bile işlemine son verilir ve bu nedenle taşıma işlemi herhangi bir ek iş yapamaz.

Bir sütun veya tablonun var olup olmadığını kontrol etmek için DB olmayan olmayan yöntemleri var mı? Başarısız olmak, kurtarma bloğumu gerçekten işe yaratabilmenin bir yolu var mı?

cevap

132
Raylar 3.0 itibariyle

ve daha sonra, bir sütunun varlığı kontrol etmek için column_exists? kullanabilirsiniz. 2.1 Raylar kadarıyla uzanan bir table_exists? fonksiyonu da var

unless column_exists? :statuses, :hold_reason 
    add_column :statuses, :hold_reason, :string 
end 

.

+0

daha kısa, en iyi pratik özellik olarak kabul mı eklemek/oluşturmak için bir sütun/tablo var mı kontrol etmek için buz? (Tabii ki eldeki probleme bağlı olduğunu biliyorum) –

+2

Değişiklik yönteminde tanımladığımda bu geri almalarla çalışır mı? – dardub

+0

Evet, geri dönüş bir sorun olurdu ... sütunu kaldırmamız gerekip gerekmediğinden emin değiliz ... çünkü önceki durumu kaydetmiyoruz. – songyy

4

Raylar 2.x için aşağıdaki ile kolonların varlığını kontrol edebilirsiniz:

columns("[table-name]").index {|col| col.name == "[column-name]"} 

nil döndürürse, böyle bir sütun bulunmaktadır. Bir Fixnum döndürürse, sütun var. Eğer sadece kendi adından daha fazla bir sütun tanımlamak istiyorsanız Doğal olarak, örneğin, {...} arasında daha seçici parametreleri koyabilirsiniz:

{ |col| col.name == "foo" and col.sql_type == "tinyint(1)" and col.primary == nil } 

(ilk How to write conditional migrations in rails? yayınlanan bu yanıt)

0

add_column: durumları ,: hold_reason,:? Status.column_names.include sürece dize ("hold_reason")

5

Ya

add_column :statuses, :hold_reason, :string unless column_exists? :statuses, :hold_reason 
+0

Bu, diğer cevap hakkında bir yorum, bir cevap değil. Teşekkürler. –

İlgili konular