我想在数据库中显示一段随机记录一段时间,之后它会刷新到另一个随机记录。如何在rails中每隔几分钟更改一次变量?
我该如何解决这个问题?
现在我正在寻找cronjobs的方向,也是每当宝石,..但我不是100%肯定我真的需要所有这些似乎是一个非常简单的行动?
我想在数据库中显示一段随机记录一段时间,之后它会刷新到另一个随机记录。如何在rails中每隔几分钟更改一次变量?
我该如何解决这个问题?
现在我正在寻找cronjobs的方向,也是每当宝石,..但我不是100%肯定我真的需要所有这些似乎是一个非常简单的行动?
使用Rails.cache机制。
在你的控制器:
@record = Rails.cache("cached_record", :expires_in => 5.minutes) do
Model.first(:offset =>rand(Model.count))
end
第一执行过程中,导致了Rails缓存被缓存。 5分钟后检索新的随机记录。
我会在我的模型中有一个expiry_date,然后向用户提供一个javascript定时器。时间过后,我会发送请求回服务器(ajax可能,或者可能刷新页面),并检查时间是否确实已过期。如果是这样,我会提出新的记录。
你可以简单地查看当前的时间在你的控制器,是这样的:
def show
@last_refresh ||= DateTime.now
@current ||= MyModel.get_random
@current = MyModel.get_random if (DateTime.now - @last_refresh) > 5.minutes
end
这种代码不会扩展到多个服务器(因为它依赖于类变量用于数据存储),所以在实际情况是,您不希望将这两个类变量存储在Redis(甚至是Memcache)中 - 这是为了获得高性能。真正取决于你需要的准确度以及你需要的性能。您也可以使用常规数据库来存储到期时间,然后加载时间最新的记录。
我的第一个尝试是将记录缓存在全局中,但最终可能会得到由不同服务器提供的不同记录。如何添加:chosen_at datetime列到你的记录......
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
只是一个小的通知,说在这个例子中没有服务器检查。如果您关心安全性,则应该根据服务器存储的值对其进行检查,如模型属性。 – Spyros 2011-03-03 02:21:37