2009-06-10 7 views
0

my sql DBには、テーブル「jobs」と「job_categories」が含まれています。rails:データマイグレーションの値をクラス/モデル変数にリンクする方法は?

「job_categories」は、ジョブカテゴリ文字列(「ソフトウェア開発」)を整数(つまり7)に関連付けます。

さまざまなクエリ機能のために、これらの関連付けをジョブコントローラの変数に保存する必要があります。レールを使ってjob_categoriesテーブルの変更をジョブコントローラの変数に動的にリンクするにはどうすればよいですか?私は数週間前からRoRと一緒に仕事をしてきましたが、すべてがやり取りする方法についてはあまりあいまいです。ありがとうございました!

+0

少なくともRails DBのスキーマ管理の意味ではないが、これはマイグレーションと関係があるようには聞こえません。 –

答えて

3

あなたがしようとしているものには大きな難点がありますが、まず質問に答えてお答えします。

JobsControllerにクラスレベルのアクセサを作成し、Saveおよびdestroyイベントの後にJobsControllerを適切に変更するObserverをJobCategoryクラスに書き込みます。

class JobsController < ActionController::Base 
    @@categories = JobCategory.find(:all) 
    cattr_accessor :categories 

    # ... 
end 

class JobCategoryObserver < ActiveRecord::Observer 
    def after_save(category) 
    JobsController.categories[category.name] = category.id 
    end 

    def after_destroy(category) 
    JobsController.categories.delete(category.name) 
    end 
end 

名前の変更を許可する場合は、古い名前を削除する追加のロジックが必要になります。 ActiveRecord::Dirtyの方法がそれを助けるでしょう。

だから、つかまります。このようなアプローチの問題は、通常、複数のプロセスが要求を処理していることです。 job_categoriesテーブルを変更することはできますが、その変更は1つのプロセスでのみ更新されます。他はもう古くなっています。

job_categoriesテーブルは小さくなる可能性があります。任意の頻度でアクセスされている場合は、OSまたはデータベースサーバーによってメモリにキャッシュされます。十分にクエリを実行すると、そのクエリの結果がデータベースによってキャッシュされることさえあります。あなたが頻繁にそれを照会していない場合は、とにかくJobsControllerの中にキャッシュしようとすることに気にする必要はありません。

メモリに絶対にキャッシュする必要がある場合は、memcachedを使用する方がよいでしょう。それから、すべてのRailsプロセスが動作し、失効したデータがない単一のキャッシュを取得します。

関連する問題