加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:00:27 所属栏目:百科 来源:网络整理
导读:我想编写一个自定义的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?(N
我想编写一个自定义的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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读