3

テーブル内のすべてのモデルをキャッシュ(および期限切れ)する必要があります。

たとえば、Currencyという名前のモデルがある場合、可能な通貨は10個未満です。したがって、次のようにすると便利です。

class Currency < ActiveRecord::Base
  cache_all(:expire_in => 10.minutes)
end

となることによって

Currency.all
Currency.find_by_name("USD")

DBにヒットしないでください。

それは良いアプローチだと思いますか?

また、DBにバックアップされていないモデルを使用したほうがよいと思われる場合は、コメントしてください。ARスタイルのアソシエーションが欲しいのでご注意ください。

4

1 に答える 1

9

データセットは非常に小さいので、おそらく最良の方法はそれをローカルメモリにキャッシュすることです。これを行うにはいくつかの方法があります。1つは、ここに示すようにメモ化を使用することです。ただし、同じオブジェクトであっても、allメソッドとメソッドを別々のキャッシュに格納するため、これは最も効率的ではありません。find_by_name

別の方法は、オブジェクトを手動でキャッシュするメソッドを再定義することです。このようなもの。

class Currency < ActiveRecord::Base
  def self.all
    @all_cache ||= super.map(&:freeze) # freeze so you don't modify the cached objects
  end

  def self.find_by_name(name)
    all.detect { |c| c.name.to_s.downcase == name.to_s.downcase }
  end

  def self.flush_all_cache
    @all_cache = nil
  end
end

これを処理するプラグインがあるかもしれませんが、私はそれをまったく調べていません。

于 2009-08-03T16:18:35.687 に答える