我目前正在使用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?还是其他任何解决方案?
感谢您的帮助!
答案 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
感谢您的帮助!