gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:48:56 26 4
gpt4 key购买 nike

我想写一个自定义的 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我收到了 Enumerator而不是 Array ,这很糟糕,因为我有时会使用 [] 运算符。

即使使用枚举器也不能很好地工作 - 在迭代最后一个条目时,我得到:
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 gem,这些家伙花了很多精力来弄清楚。

要查看的其他 gem :simple_cacheable

关于ruby-on-rails - 自定义 Rails 缓存和关联 - 覆盖 ActiveRecord.find,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7943892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com