Как создать простой кэш статических моделей в рельсах? - PullRequest
0 голосов
/ 04 декабря 2009

У меня есть несколько моделей, которые содержат статические данные, и я пытаюсь их кешировать. Я читал различные руководства и Railscasts по кешированию и думал, что это будет просто, но все еще не могу понять это. Например, у меня есть следующая модель

class ActionType < ActiveRecord::Base

  def self.find(id)
    Rails.cache.fetch(cache_key) { ActionType.find(id) }
  end 

end

Но это создает следующие ошибки:

wrong number of arguments (2 for 1)

со следующей трассировкой стека

C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `find'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `send'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `find_target'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/association_proxy.rb:240:in `load_target'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/association_proxy.rb:112:in `reload'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations.rb:1219:in `action_type'

Я недавно обновился до Rails 2.3.3 (с 2.0.1), чтобы использовать преимущества кэширования, встроенного в более свежие версии.

Кроме того, большинство этих моделей представляют собой простые справочные таблицы с идентификатором и описанием. Тем не менее, у каждого есть 30 столбцов и более 100 строк, но это все еще действительно статические данные, которые я хотел бы кэшировать, если это возможно. Все эти 30 столбцов, кроме одного, являются логическими значениями и маленькими целыми числами (последний является короткой строкой), поэтому он не должен занимать слишком много памяти.

1 Ответ

2 голосов
/ 04 декабря 2009

Одной из проблем здесь является попытка переопределить метод ActiveRecord find. Возможно, я бы создал метод класса с именем find_cached или что-то вместо этого.

Учитывая это, откуда берется ваша переменная cache_key? Подумайте только об использовании идентификатора, что-то вроде

class ActionType < ActiveRecord::Base

  def self.find_cached(id)
    Rails.cache.fetch("action_type_cache/#{id}") { ActionType.find(id) }
  end 

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