我有一张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