2014-11-20 31 views
0

我有一个模型,我想要实现作用域跟踪功能(例如已应用了哪些作用域),我需要这个以便有条件地应用其他作用域。所以,我决定在类级别上创建一个实例变量,该变量将包含与范围名称对应的符号数组。每次当范围被应用时,它的符号被推入数组中。所以问题是我期待数组在每次请求时都被初始化。但据我了解,rails会缓存所有类(仍然关闭cache_classes选项),并且这会导致数组内容在请求之间保存的行为,所以当我更改要应用的作用域时(它们有条件地应用,取决于GET参数),我在该数组中找到旧的范围符号,而不是新的。也许经过几次请求后,我可以看到新的结果,但它是随机发生的。所以我假设的代码如下:Rails缓存类变量

class Apple < ActiveRecord::Base 
    @scopes = [] 
    def self.scopes 
    @scopes 
    end 

    scope :green, -> { scopes << :green } 
end 

我已经尝试不同的变量组合(类变量,类的实例变量,定义上eigenclass存取和变量,也许别的东西 - 我不记得了),试图使用Array.new方法创建数组副本或创建数组,但没有运气。

回答

0

看来,你可以清除此数组中的before_filter

class ApplicationController 
    before_filter :clear_scope_history 

    private 

    def clear_scope_history 
    Apple.scopes.clear 
    # Banana.scopes.clear 
    # etc. 
    end 
end 

顺便说一句,scopes是你的方法的名字一个不错的选择。可能会覆盖ActiveRecord中的一个。将它重命名为scope_usage_history或类似的东西。

+0

是的,我可以这样做,但它看起来不是很好的方法。问题仍然存在,为什么它的行为如此呢?我该如何优雅地克服它? – 2014-11-20 16:57:23

+0

那么,如果文件没有改变(为了性能的原因),rails可能不会重载类。你可以变得很花哨,并将上面的代码转换成一个模块,并附带元编程魔术。我想象得更好看。但是这个很简单,就像摇滚一样。遗留代码不是最不重要的特性。 :) – 2014-11-20 17:02:13

+0

顺便说一句,它不起作用:(我的意思是,在每一个请求我得到一个空的数组。 – 2014-11-20 17:05:48