2010-10-03 14 views
2

我有一个严重依赖日期的应用程序。根据当前日期设置这些日期需要进行适度昂贵的计算。就每个请求而言,这些日期是常量 - 它们一旦创建就不会改变 - 但它们在整个一周内都会改变。日期在控制器和模型中都使用。在rails中,在哪里放置一个基于当前日期变化的常量(变量?)?

我的问题是这样的:

  • 如果日期没有每一天的变化,我能/设置它们的配置初始化。但是,当服务器重新启动
  • ,如果我使用的before_filter设置在ApplicationController中的日期初始化,只能判断,日期是不提供给我的模型

任何想法?我看着这一切都错了吗?谢谢。

回答

1

我认为在这里你可以使用Rails缓存。有关更多详细信息和示例,请参阅herehere

Basicaly,你可以写缓存:

Rails.cache.write('date', Date.today) 

和阅读:

Rails.cache.read('date') 

可以在整个Rails应用程序使用它(模型,视图,控制器,...)。

您可以将任何对象存储在缓存中。默认缓存使用内存,可用于单个Rails实例,但您可以使用不同的缓存存储方法。

+2

这是在正确的轨道上。您需要将日期设置为缓存键的一部分,以便在日期更改时自动缓存未命中。例如:https://gist.github.com/6c381274d6ad7a78b0d0- 在这种情况下,如果存在,则获取将返回“some_cache_key _#{Date.today}”。如果它还不存在,那么它会调用my_expensive_operation,然后将该方法的结果保存到“some_cache_key _#{Date.today}下的缓存中” – semanticart 2010-10-03 21:36:55

+0

我最终使用了klew和Amadan的答案组合...所以现在我只需要每天生成一次日期。非常感谢大家,这是一个巨大的帮助。 – rxb 2010-10-04 02:37:54

2

其中一种方法是:创建一个单例类,在询问实例时检查日期。关闭我的头顶,

class MyDates 
    def self.get_instance 
    unless @instance && @date == Date.new 
     @date = Date.new 
     @instance = self.new(@date) 
    end 
    @instance 
    end 

    def initialize(date) 
    # calculate the expensive stuff 
    end 
end