Кешировать все модели в таблице - PullRequest
3 голосов
/ 03 августа 2009

Мне нужно кэшировать (и срок действия) все модели в таблице.

Например, если у меня есть модель с именем Валюта, у меня есть только менее 10 возможных валют. Поэтому было бы неплохо иметь:

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

так что

Currency.all
Currency.find_by_name("USD")

не должен попадать в БД.

Как вы думаете, это может быть хорошим подходом?

Кроме того, если вы считаете, что было бы лучше использовать модель, которая не поддерживается БД, прокомментируйте это. Обратите внимание, что я хотел бы иметь ассоциацию в стиле AR.

1 Ответ

7 голосов
/ 03 августа 2009

Поскольку набор данных настолько мал, вероятно, лучше всего кешировать его в локальной памяти. Есть несколько способов сделать это, один из них - использовать Memoization, как я показываю здесь . Однако это не самый эффективный метод, поскольку он будет хранить метод 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

Может быть, есть плагин, чтобы справиться с этим для вас, но я вообще не рассматривал это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...