我有一个模型,我想要实现作用域跟踪功能(例如已应用了哪些作用域),我需要这个以便有条件地应用其他作用域。所以,我决定在类级别上创建一个实例变量,该变量将包含与范围名称对应的符号数组。每次当范围被应用时,它的符号被推入数组中。所以问题是我期待数组在每次请求时都被初始化。但据我了解,rails会缓存所有类(仍然关闭cache_classes
选项),并且这会导致数组内容在请求之间保存的行为,所以当我更改要应用的作用域时(它们有条件地应用,取决于GET
参数),我在该数组中找到旧的范围符号,而不是新的。也许经过几次请求后,我可以看到新的结果,但它是随机发生的。所以我假设的代码如下:Rails缓存类变量
class Apple < ActiveRecord::Base
@scopes = []
def self.scopes
@scopes
end
scope :green, -> { scopes << :green }
end
我已经尝试不同的变量组合(类变量,类的实例变量,定义上eigenclass存取和变量,也许别的东西 - 我不记得了),试图使用Array.new
方法创建数组副本或创建数组,但没有运气。
是的,我可以这样做,但它看起来不是很好的方法。问题仍然存在,为什么它的行为如此呢?我该如何优雅地克服它? – 2014-11-20 16:57:23
那么,如果文件没有改变(为了性能的原因),rails可能不会重载类。你可以变得很花哨,并将上面的代码转换成一个模块,并附带元编程魔术。我想象得更好看。但是这个很简单,就像摇滚一样。遗留代码不是最不重要的特性。 :) – 2014-11-20 17:02:13
顺便说一句,它不起作用:(我的意思是,在每一个请求我得到一个空的数组。 – 2014-11-20 17:05:48