2009-04-04 7 views
6

私はテキストメッセージを送信する必要があるアプリケーションを開発しているので、キャリア情報がデータベースに保存されています。私はまた、クライアント側のコードを読むためにXMLファイルにその情報が必要です。これを実現するために、DBからキャリア情報を読み取り、configディレクトリにXMLファイルを作成するスクリプトを作成しています。私はこのスクリプトがlib/tasksに最も適していると感じました。lib/tasksのタスクからレールデータベースにアクセスするにはどうすればよいですか?

このスクリプトからデータベースにアクセスする必要がありますが、アクセスするためにオブジェクトを使用したいと思います。私が使用している場合

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

私は常にMySQLを使用しないため、異なる環境に複数のバージョンを保存する必要があります。それは非常にお粗末です。私はこれを行う方法があると確信しています。私はオブジェクトにアクセスしようとしました...これは今まで私が持っているものです:

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 

しかし、キャリアは定義されていません。このスクリプトにDB内のCarrierオブジェクトへのアクセスを与えるにはどうすればよいですか?

また、誰かが私がDBから読み込んだものを適切なXMLに変換する方法を知っていれば、それは素晴らしいものです。私は本当に素早くカスタムを書くつもりだった。

ありがとうございました!

答えて

8

あなたはこのようなあなたのタスクを定義することで、あなたのモデルにアクセスするためのRakeタスクを有効にすることができます。

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

は、このアクセス権を付与され、=> :environmentに注意してください。方法という

Carrier.all.to_xml 

注:

rake RAILS_ENV=development my_task 
rake RAILS_ENV=production my_task 

XMLシリアル化のためとして、あなたは内蔵のto_xml方法、などを使用することができます:あなたはその後、別の環境にこの方法を使用するようにrakeタスクを指示することができます。 .allはRailsに最近追加されたもので、.find(:all)のエイリアスです。

2

実際にはほとんど存在しています。スクリプトの一部としてRails環境を要求することをお勧めします。

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

これですべてのドメイン構造にアクセスできるようになりました。 Railsには、to_xmlメソッド呼び出しの使用によるデフォルトのXMLシリアル化も含まれています。試してくださいCarrier.find(:all).to_xml

2

通常、lib/tasksはレーキタスクのために予約されています。ライブラリコードを独自のディレクトリに配置したい場合があります。 lib/messaging、多分?

古いバージョンのRailsを実行していますか? find_allは最近のバージョンでは動作しません。 'find(:all)'または単に 'all'が最近のメソッドです。

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

これは、質問が尋ねるように、モデルクラスにリンクする方法については説明しません。 – Tilendor

関連する問題