我想编写一个自定义的ActiveRecord缓存,仅适用于find_by_id.
要做到这一点,我想覆盖find方法,当只给出一个int时使用我的缓存,否则使用默认实现.
要做到这一点,我想覆盖find方法,当只给出一个int时使用我的缓存,否则使用默认实现.
class X < ActiveRecord::Base def self.find(*args) return XCache[args[0]] if args.size == 1 && args[0].is_a?(Numeric) return super.find(*args) end end
除了我与X的其他实例之间的关联的情况外,一切都有效.亲子关系:
has_many :x_children has_many :children,:class_name => "X",:through => :x_children
当我调用X.find(1).children时,我得到一个枚举器而不是一个数组,这很糟糕,因为我有时会使用[]运算符.
即使使用枚举器也不能很好地工作 – 当迭代我得到的最后一个条目时:
NoMethodError: undefined method `call' for :all:Symbol
任何帮助将受到高度赞赏
进一步说明:
XCache只是一个缓存ActiveRecord实例的类.
一个简单的实现可以
class XCache @@cache = {} def self.[id] return @@cache[id] ||= X.find(id) end end
(更高级的实现可以包括到期时间,Memcached等,更通用的解决方案可以支持多个模型类).
我不认为我的问题与缓存实现有关(但我可能错了)
解决方法
正如您所见,这里有很多隐藏的复杂性.你可以看看
cache-money的宝石,这些家伙已经花了很多精力搞清楚.
其他宝石:simple_cacheable
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。