languages
ほとんどすべてが変更されないテーブルがあります。初期キャッシュ以外で、このテーブルに対するデータベース クエリを回避しようとしています。
class Language < ActiveRecord::Base
attr_accessible :code, :name, :native_name
def self.find_by_name_in_cache(name)
get_all_cached.find {|l| l.name == name}
end
def self.find_by_code_in_cache(code)
get_all_cached.find {|l| l.code == code}
end
def self.find_by_id_in_cache(id)
get_all_cached.find {|l| l.id == id}
end
def self.get_all_cached
Rails.cache.fetch('all_languages') {Language.all}
end
end
find_in_cache
定義したメソッドのいずれかを使用している限り、すべてうまくいきます。
私の質問は、ActiveRelation
キャッシングも強制的に使用するにはどうすればよいかということです。
たとえば、次のユーザー モデルを考えてみましょう。
class User < ActiveRecord::Base
belongs_to :native_language, :class_name => :Language, :foreign_key => :native_language_id
end
にアクセスすると、データベースから@user.native_language
クエリが実行language
されます。これを防ぐためのアイデアをいただければ幸いです。
私は次のことができることを知っています:
class User < ActiveRecord::Base
belongs_to :native_language, :class_name => :Language, :foreign_key => :native_language_id
def native_language_cached
Language.find_by_id_in_cache(self.native_language_id)
end
end
ただし、多くのテーブルがテーブルを参照しているため、より透過的なソリューションを望んでいました。これらすべてのモデルにメソッドをlanguages
追加するのは面倒です。cached