2009-04-04 15 views
6

Metin mesajları göndermesi gereken bir uygulama geliştiriyorum, bu yüzden bir veritabanında saklanan taşıyıcı bilgilerim var. Okumak için istemci tarafında kod için bir XML dosyasına bu bilgilere de ihtiyacım var. Bunu yapmak için, DB'den taşıyıcı bilgilerini okuyan ve config dizininde bir XML dosyası oluşturan bir komut dosyası yazıyorum. Bu betiğin lib/görevler için en uygun olacağını düşündüm.Rayları veritabanına lib/görevlerdeki bir göreve nasıl erişirim?

Veritabanına bu komut dosyasından erişmem gerekiyor, ancak erişmek için bazı nesneleri kullanmak istiyorum. Ben

db = Mysql.new("domain", "username", "password", "database") 

kullanırsanız ben MySQL her zaman kullanmayın çünkü farklı ortamlar için birden çok sürümünü tutmak zorunda kalacaktır. Bu çok özensiz olurdu. Eminim bunun bir yolu var. hangi mantıklı

RAILS_HOME = File.expand_path(File.join(File.dirname(__FILE__),"../..")) 
RAILS_CONFIG = "#{RAILS_HOME}/config" 

f = File.new("#{RAILS_CONFIG}/mls_widget_config.xml", "w") 
carriers = Carrier.find_all 
f.write carriers 
f.close 

Ama Taşıyıcı tanımlanmadı: Bu şimdiye kadar ne var ... sadece nesneyi erişmeye çalıştı. Bu komut dosyasını DB'deki Carrier nesnesine nasıl verebilirim?

Ayrıca, bir taraf, DB'den okuduğum şeyi kolayca uygun XML'ye nasıl dönüştürebileceğini çok iyi bilir. Çok çabuk özel bir şey yazacaktım.

Teşekkür ederiz!

cevap

8

Böyle görevinizi tanımlayarak modelleri erişmek için bir Rake görevi etkinleştirebilirsiniz:

task :my_task => :environment do 
    # Task code 
end 

Not bu erişim izni => :environment. yöntemin bu

Carrier.all.to_xml 

Not:

rake RAILS_ENV=development my_task 
rake RAILS_ENV=production my_task 

XML seri gelince, yerleşik to_xml yöntemle gibi kullanabilirsiniz: Daha sonra farklı ortamlarını bu şekilde kullanmak için Rake görevi talimat verebilirsiniz .all, Rails'in yakın tarihli bir ekidir ve .find(:all) için bir diğer addır.

2

Aslında neredeyse oradasınız; Sadece çok gibi, senaryonun parçası olarak Raylar ortamı gerektiren öneriyoruz:

RAILS_HOME = File.expand_path(File.join(File.dirname(__FILE__),"../..")) 
RAILS_CONFIG = "#{RAILS_HOME}/config" 
require "#{RAILS_CONFIG}/environment" 

Artık alan yapının tüm erişimi olmalıdır. Raylar ayrıca to_xml yöntem çağrısı kullanılarak varsayılan XML serileştirme içerir; Carrier.find(:all).to_xml'u deneyin.

2

Kural gereği, genellikle komisyon görevleri için lib/task ayrılmıştır - kitaplık kodunuzu kendi dizinine koymak isteyebilirsiniz. lib/mesajlaşma, belki?

Rails'in eski bir sürümünü mi kullanıyorsunuz? find_all son sürümlerde çalışmaz: 'find (: all)' ya da sadece 'all' günümüzde yöntemlerdir.

File.new("#{RAILS_ROOT}/mls_widget_config.xml", "w") do |f| 
    Carrier.all.each { |carrier| f.puts carrier.to_xml } 
end 
+0

Bu soru, model sorgusuna nasıl bağlanacağını açıklamıyor. – Tilendor

İlgili konular