禁用Time.now的rails class_caching机制?

时间:2010-08-11 09:00:42

标签: ruby-on-rails class caching

我目前正在使用rails class_caching机制,因为我需要返回随时间变化的文件路径。它用于在 GRAIN 秒之后不断更改日志文件路径并返回完全工作的时间戳:

GRAIN = 30

def self.file_path  
   timestamp = (Time.now.to_i / GRAIN) * GRAIN
   return FILE_DIR + "tracking_#{timestamp.call}.csv"  
end

如果rails的class_caching设置为false,这非常有用。但当然应用程序是使用启用的类缓存运行。只要我启用它,就会缓存timestamp变量或Time.now表达式。

我尝试用proc块解决这个问题,但没有成功:

def self.file_path
    timestamp = Proc.new { (Time.now.to_i / GRAIN) * GRAIN }
    return FILE_DIR + "tracking_#{timestamp.call}.csv"
end

有什么类似缓存禁用范围我可以使用或类似skip_class_caching:file_path?还是其他任何解决方案?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您的代码位于何处并不完全清楚,但ActiveRecord有一个uncached方法可以暂停其块内的任何内容的缓存。

答案 1 :(得分:0)

我发现了问题。不是Time.now正在缓存,而是一个记录器实例。它是在调用file_path的另一个方法中分配的。

只要禁用了类缓存,环境就会忘记请求之间的类变量。但是一旦启用它,类变量保持不变 - 并且期望值 - 但从未改变。

所以我必须添加一个简单的条件来检查自上次请求以来file_path是否发生了变化。如果是这样,则重新分配类变量,否则它保持相同的期望值。

我改变了:

def self.tracker
    file_path = Tracking.file_path
    @@my_tracker ||= Logger.new(file_path)
end

为:

def self.tracker
    file_path = Tracking.file_path
    @@my_tracker = Logger.new(file_path) if @@my_tracker.nil? or Tracking.shift_log?(file_path)
    @@my_tracker
end

感谢您的帮助!