ROR geçişi sırasında bir sütun türünü Date yerine DateTime olarak değiştirme


227

Yaptığım bir uygulama için sütun türümü tarihten datetime olarak değiştirmem gerekiyor. Veriler hala geliştirildiği için umurumda değil.

Bunu nasıl yapabilirim?

Yanıtlar:


508

Terminalinizde bir ilk:

rails g migration change_date_format_in_my_table

Ardından taşıma dosyanızda:

Raylar için> = 3.2:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
    change_column :my_table, :my_column, :datetime
  end

  def down
    change_column :my_table, :my_column, :date
  end
end

27
Haklısın, yeni başlayan bir kişinin mevcut en son teknolojiyi seçeceğini varsaydım, ancak bu elbette emin değil
apneadiving 8

12
Soru "ruby-on-rails-3" olarak etiketlendi
Sucrenoir

2
@Sucrenoir Evet, etiket cevapladıktan sonra apneadiving tarafından eklendi.
Jason

10
Tek bir neden merak ediyorsanız changeyöntemi yerine kullanılmaz upve downyöntemlerin, bunun sebebi yöntem desteklemez göç tanımı . changechange_column
Dennis

2
Bu cevap sadece kısmen doğrudur, 4 numaralı rayda bile change_column içinde değişiklik yapamazsınız veya aşağı geçiş çalışmaz. Rayların sürümü ne olursa olsun yukarı / aşağı kullanmalısınız.
Alan Peabody

78

Ayrıca, Rails 3 veya daha yenisini kullanıyorsanız upve downyöntemlerini kullanmanız gerekmez . Sadece şunu kullanabilirsiniz change:

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end

78
Değişiklik yöntemi yalnızca geri dönüşümlü taşıma işlemleriyle çalışır. Yukarıdaki kod bir ActiveRecord :: IrreversibleMigration istisnası atar. Değişim yönteminde yalnızca api.rubyonrails.org/classes/ActiveRecord/Migration/… ' daki yöntemler kullanılmalıdır.
davekaro

3
Rails 4 kullanıyorum ve daha önce bu tür bir göç yaptım. DEĞİŞİM ÇALIŞMIYOR! @ davekaro'nun yorumu doğru.
harryt

3
Rails 5 için bu doğru ve çalışan bir çözümdür.
WM

3
Tersine çevrildiğinde, eski sütun türünün ne olarak değişmesi gerektiğini nasıl bilebilir?
Andrew Grimm

@AndrewGrimm haklısın. This migration uses change_column, which is not automatically reversible. To make the migration reversible you can either: 1. Define #up and #down methods in place of the #change method. 2. Use the #reversible method to define reversible behavior.
Göçümü

42

Rails 3.2 ve Rails 4'te Benjamin'in popüler cevabının biraz farklı bir sözdizimi vardır.

Terminalinizde bir ilk:

$ rails g migration change_date_format_in_my_table

Ardından taşıma dosyanızda:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
   change_column :my_table, :my_column, :datetime
  end

  def down
   change_column :my_table, :my_column, :date
  end
end

23

Bir change_column yöntemi var, bunu datetime ile yeni bir tür olarak taşıma işleminizde yürütün.

change_column(:my_table, :my_column, :my_new_type)

1
bu orijinal verileri koruyor mu?
BKSpurgeon

1
Evet, orijinal verileri
Mauro

1

AFAIK, şema değişiklikleri yaparken önem verdiğiniz verileri (yani üretim) yeniden şekillendirmeye çalışmak için göçler var. Öyleyse bu yanlış olmadıkça ve verileri umursamadığını söylemiş olduğundan, neden yalnızca orijinal geçişteki sütun türünü tarihten tarih saatine değiştirip taşıma işlemini yeniden çalıştırmıyorsunuz? (Umarım testleriniz vardır :)).


2
Verileri önemsemeseniz bile, bir ekipte çalışıyorsanız ve şema değişikliğinizin ekibinizdeki diğer tüm geliştiricilere yayılmasını istiyorsanız, geliştirme ortamında bir taşıma kullanmayı potansiyel olarak önemseyebilirsiniz.
Jose B

Bir sütunu değiştirmek için ek geçişe sahip olmanın ne gibi bir avantajı olduğunu görmekte sorun yaşıyorum. Sütunu oluşturan orijinal geçişi değiştirmenin nesi yanlış? Her iki durumda da, her takım üyesi yeni şemayı almak için tüm taşıma işlemlerini yeniden çalıştırmalıdır.
fakeleft

Yeni bir taşıma kullanırsanız, sütun türünü değiştiren taşıma işlemini geri alabilirsiniz. Orijinali düzenleyecekseniz, bu düzenlemeyi geri almanız ve daha sonra taşıma işlemlerini yeniden çalıştırmanız gerekir.
jazzpi

Bu, henüz üretim verisi olmadığı düşünüldüğünde aslında çok ihtiyatlı bir cevaptır. Diğer ekip üyeleri hakkında endişe duyanlar rake db:migrate:resetiçin bunun sebebi budur.
Ryan McGeary
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.