【发布时间】:2011-03-13 09:58:28
【问题描述】:
我想在一段时间内显示数据库中的随机记录,然后刷新到另一个随机记录。
我将如何在 Rails 中解决这个问题?
现在,我正在寻找 cronjobs 的方向,也是每次 gem,.. 但我不能 100% 确定我是否真的需要所有这些来完成看似非常简单的操作?
【问题讨论】:
标签: ruby-on-rails cron
我想在一段时间内显示数据库中的随机记录,然后刷新到另一个随机记录。
我将如何在 Rails 中解决这个问题?
现在,我正在寻找 cronjobs 的方向,也是每次 gem,.. 但我不能 100% 确定我是否真的需要所有这些来完成看似非常简单的操作?
【问题讨论】:
标签: ruby-on-rails cron
使用 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 日期时间列怎么样...
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
【讨论】: