【问题标题】:How do I change a variable every so minutes in rails?如何在rails中每隔几分钟更改一个变量?
【发布时间】:2011-03-13 09:58:28
【问题描述】:

我想在一段时间内显示数据库中的随机记录,然后刷新到另一个随机记录。

我将如何在 Rails 中解决这个问题?

现在,我正在寻找 cronjobs 的方向,也是每次 gem,.. 但我不能 100% 确定我是否真的需要所有这些来完成看似非常简单的操作?

【问题讨论】:

    标签: ruby-on-rails cron


    【解决方案1】:

    使用 Rails.cache 机制。

    在您的控制器中:

    @record = Rails.cache("cached_record", :expires_in => 5.minutes) do
      Model.first( :offset =>rand(Model.count))
    end
    

    在第一次执行期间,结果被缓存在 Rails 缓存中。 5 分钟后检索一条新的随机记录。

    【讨论】:

      【解决方案2】:

      我会在我的模型中有一个 expiry_date,然后向用户展示一个 javascript 计时器。时间过去后,我会向服务器发送一个请求(可能是ajax,或者刷新页面)并检查时间是否确实已过期。如果是这样,我会展示新记录。

      【讨论】:

        【解决方案3】:

        您可以简单地检查控制器中的当前时间,例如:

        def show
          @last_refresh ||= DateTime.now
          @current ||= MyModel.get_random
          @current = MyModel.get_random if (DateTime.now - @last_refresh) > 5.minutes
        end
        

        这种代码不会扩展到更多的服务器(因为它依赖于类变量来存储数据),所以实际上你不希望将这两个类变量存储在 Redis 之类的东西中(甚至是 Memcache) -那是为了高性能。真正取决于您需要它的准确程度以及您需要多少性能。您也可以使用普通数据库存储到期时间,然后加载时间为当前的记录。

        【讨论】:

        • 只是一个小提示说在这个例子中服务器没有检查。如果您关心安全性,则应根据服务器存储的值(例如模型属性)对其进行检查。
        【解决方案4】:

        我的第一个方法是将记录缓存在全局中,但您最终可能会得到由不同服务器提供的不同记录。在您的记录中添加 :chosen_at 日期时间列怎么样...

        class Model < AR::Base
        
          def self.random
            @@random = first(:conditions => 'chosen_at NOT NULL')
            return @@random unless @@random.nil? or @@random.chosen_at < 5.minutes.ago
            @@random.update_attribute(:chosen_at,nil) if @@random
            ids = connection.select_all("SELECT id FROM things")
            @@random = find(ids[rand(ids.length)]["id"].to_i)
          end
        
        end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-05-08
          • 1970-01-01
          • 1970-01-01
          • 2012-07-14
          • 2020-09-18
          • 1970-01-01
          • 2010-10-13
          相关资源
          最近更新 更多