Rails: добавление дополнительных методов в модель для извлечения кеша - PullRequest
1 голос
/ 28 сентября 2011

При добавлении кеширования в модель в Rails существует повторяющаяся природа, которая выглядит следующим образом:

class Team < ActiveRecord::Base
  attr_accessible :name
end

Before caching, to retrieve a name, everything was trivial,

team = Team.new(:name => "The Awesome Team")
team.save

team.name # "The Awesome Team"

С введением кеширования с использованием memcached или redis я добавляю методы к своим моделям, и это суперповторяющиеся:

def get_name
  if name_is_in_cache
    return cached_name
  else
    name
  end
end

def set_name(name)
  # set name in cache
  self.name = name
end

Есть ли какой-то очевидный способ, которым я упускаю, чтобы очистить это?Я кеширую множество полей по-разному, и кажется, что attr_accessible на данный момент практически избыточен.Как это можно почистить?

1 Ответ

2 голосов
/ 28 сентября 2011

Создайте миксин, который просто предоставляет оболочки вокруг instance_eval.Не проверено:

module AttributeCaching
  def cache(name)
    instance_eval(<<-RUBY)
      def get_#{name}
        if #{name}_is_in_cache
          return cached_#{name}
        else
          #{name}
        end
      end
    RUBY

    instance_eval(<<-RUBY)
      def set_#{name}(name) 
        self.#{name} = name
      end
    RUBY
  end
end

Тогда в вашей модели:

class Team < ActiveRecord::Base
  extend AttributeCaching

  cache :name
  cache :something_else
end

Однако вы, вероятно, могли бы сделать свою жизнь намного проще, не называя каждый из ваших методов кэширования по-разному.Не могли бы вы сделать что-то вроде get_cached(name) и set_cached(name, value), тогда ваша проблема внезапно становится намного менее повторяющейся.

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