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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |