【问题标题】:Rails: adding additional methods to a model for cache retrievalRails:向模型添加其他方法以进行缓存检索
【发布时间】:2011-11-26 11:05:27
【问题描述】:

在 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 几乎是多余的。如何清理?

【问题讨论】:

  • 您能否添加一些强制您使用缓存的复杂/性能密集型方法的示例?

标签: ruby-on-rails ruby caching activerecord redis


【解决方案1】:

创建一个仅提供 instance_eval 包装器的 mixin。未经测试:

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)之类的事情,然后你的问题突然变得不那么重复了。

【讨论】:

  • 我应该在我原来的问题中更具体。这确实回答了这个问题。然而,使用 Redis 之类的工具,有不同的数据类型以及从这些类型中添加/删除的不同方法。在这种情况下,您上面的抽象将失败。话虽如此,您确实以最初提出的方式回答了问题,对此我表示感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多