2009年05月28日

Railsのdevelopment環境でYAML.loadを使った場合にloadに失敗する事がある

今日はプログラミング技術の話題。
(興味が無い人には意味のわからない内容となっています。)


『すうじあむ』のある特定の非常に重たい検索処理で、
頻繁な検索実行を抑える為に検索結果をファイルとして保存し
キャッシュしておくような処理がある。

ファイルの保存にはRubyのYAMLモジュールを使って、
ActiveRecordオブジェクトリスト(検索結果リスト)を
yaml形式に変換して保存している。

コードに直すとこう。

list = ActiveRecord.find(:all, 〜検索処理〜)
path = "保存するファイル名"
File.open(path,'w') {|f| f.puts list.to_yaml }

これでActiveRecordオブジェクトの情報も保持して保存してくれるので、
復元が非常に楽チンだ。
ところがこのファイルを読み込んでリストに戻す時に注意が必要。
Railsをdevelopment環境で実行時にのみ元のオブジェクトに戻らず、
YAMLオブジェクトのリストとなってしまう。

どうやらdevelopment環境では毎回クラスをロードしているので、
YAML.loadを実行する時に対象のActiveRecordクラスが見えていないよう。
loadを行う前にそのクラスをロードする処理を入れてやれば、
問題なく復元されるようになった。

loadはYAML.loadの手前にクラスをこんな感じに書いてやるだけで良い。

Examination # ExaminationというActiveRecordクラスに復元したい
path = "保存するファイル名"
list = YAML.load(File.read path)

test,production環境では起動時にだけクラスをロードするので、
サーバ起動中に一回でもロード済みなら問題ないようだ。



※『すうじあむ』はRuby On Railsを利用しています。

※Railsのバージョンは2.0.2でRubyのバージョンは1.8.6を使用。



【関連する記事】
posted by すうじあむ開発者 at 20:48| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。