2008-09-16 11 views
5

Sen bir ilk sürümünü oluşturmak/Rails ile ActiveRecord 2.1.1Rake db: migrate yeni geçiş algılamıyor mu?

  • Tecrübeli yakut komut (örneğin) \ iskele ürün başlığı oluşturmak: string açıklaması: Metin IMAGE_URL: string
  • Bu oluşturmak (örneğin) bir geçiş dosyası 20080910122415_create_products.rb sen tırmık db ile göç uygulamak
  • seslendi: Şimdi, yakut komut dosyası ile ürün tabloya bir alan eklemek
  • göç ​​\ göç add_price_to_product fiyat oluşturmak: ondalık
  • Bu 20080910125745_add_price_to_product.rb adlı bir geçiş dosyası oluşturun.
  • Rak db: migrate'ı çalıştırmayı denerseniz, ilk geçişi geri alır, bir sonraki uygulamayın! Böylece ürün tablonuz yok olacak! (Tablo tahrip edildikten sonra) göç için tüm göçler geçerli olacaktır: yalnız rake kaçsam
  • Ama, bu bir göç

Pls uygulayarak tırmık db dikkat inceleniyor olduğunu size söylerdim.

rake db:migrate version=20080910125745 

Yani, merak ediyorum: Bu bir beklenen yeni davranış

buldum tek geçici çözüm olarak yeni göç sürümünü belirtmektir?

cevap

1

Sen ileriye gitmek için zorlamak için

rake db:migrate:up 

kullanmak gerekir, ancak o zaman koşarsan ekibinizin

diğer insanlardan eksik Interleaved göçler riske

rake db:migrate 

iki kez, tüm geçişlerinizi yeniden uygular.

SQLite ile aynı davranışı Windows'ta karşılaşıyorum, böyle bir ortama özgü bir hata olabilir.

Düzenle - Nedenini buldum. Demiryolu veri tabanında.tırmık görev aşağıdaki kodu var: Ben benim ortam değişkenleri Sonra

desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x. Turn off output with VERBOSE=false." 
task :migrate => :environment do 
    ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true 
    ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil) 
    Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby 
end 

ENV["VERSION"] # => V3.5.0f 
ENV["VERSION"].to_i #=>0 not nil ! 

Ruby

yılında
echo %Version% #=> V3.5.0f 

dolayısıyla tırmık görev

ActiveRecord::Migrator.migrate("db/migrate/", 0) 

çağırır ve Aktif Record :: Yükseltici Elimizdeki:

class Migrator#:nodoc: 
    class << self 
    def migrate(migrations_path, target_version = nil) 
     case 
     when target_version.nil?    then up(migrations_path, target_version) 
     when current_version > target_version then down(migrations_path, target_version) 
     else          up(migrations_path, target_version) 
     end 
    end 

Evet, rake db:migrate VERSION=0rake db:migrate:down

Düzenleme için uzun versiyonu - Ben deniz feneri hata güncelleme gider ama süper şirket vekil ben bağlamak yasak eden orada

Bu arada, geçişi aramadan önce Sürümünüzü kaldırmayı deneyebilirsiniz ...

0

Bu, beklenen davranış değil. Bunu deniz fenerinde bir böcek olarak rapor etmeyi önerecektim ama görüyorum ki already done so! Daha fazla bilgi verirseniz (OS/veritabanı/ruby ​​sürümü dahil) bir göz atacağım.

1

Saygılarımla Tom'a katılmıyorum! Bu , bir hata! V3.5.0f, komisyon geçişleri için geçerli bir sürüm değil. Rake geçirmek için kullanmamalısınız: down yakut "V3.5.0f" .to_i 0 olduğunu dikkate almak seçti diye ... Kullanıcılar naber olduğunu biliyoruz böylece

Rake yüksek sesle o VERSİYONU geçerli değil şikayet etmelidir (siz ve ben arasında, sürümün bir tamsayıya dönüştürerek bir YYYYMMDD biçimlendirilmiş zaman damgası olduğunu kontrol edin) biraz daha hafiftir)

[Yorum yazmama izin vermeyen Lann IE6! ve hiçbir ben

Teşekkür senin soruşturma için çok kurumsal tarayıcı sayesinde]

0

Jean değiştiremez. Haklısınız ve aslında türlerin tasarım hatalarından daha şiddetli bir böcek keşfettiğinizi düşünüyorum.

Neler oluyor? Bu, komisyonun komut satırına geçirdiğiniz değeri yakalayıp bunları ortam değişkenleri olarak saklayacağıdır. Sonunda çağrılacak olan komisyon görevleri sadece bu değerleri çevre değişkeninden alır. db: ENV ["VERSION"] sorgularını geçirdiğinde, aslında arama yanıtını ayarladığınız sürüm parametresini ister. Rake db: migrate öğesini çağırdığınızda, herhangi bir sürümü geçemezsiniz.

Ancak, başka bir program tarafından başka amaçlar için ayarlanmış olan VERSION adlı bir ortam değişkenine sahibiz (hangisi değil). Ve komisyonun arkasındaki adamlar (veya database.rake'nin arkasında) bunun gerçekleşeceğini düşünmedi. Bu bir tasarım hatası. En azından, yalnızca "VERSION" yerine "RAKE_VERSION" veya "RAKE_PARAM_VERSION" gibi daha özel değişken adlar kullanmış olabilirler.

Tom, Bu yeni bulguları yansıtmak için kesinlikle kapanmayacağım ama deniz feneri hakkındaki hata raporumu düzenleyeceğim.

Ve yardımlarınız için Jean'e tekrar teşekkürler.Bu hatayı 5 gün agao gibi deniz fenerinde yayınladım ve hala cevabım yok!

Rollo

İlgili konular