微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 自定义Rails缓存和关联 – 覆盖ActiveRecord.find

我想编写一个自定义的ActiveRecord缓存,仅适用于find_by_id.
要做到这一点,我想覆盖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 举报,一经查实,本站将立刻删除。

相关推荐