2011-03-03 95 views
2

我想在数据库中显示一段随机记录一段时间,之后它会刷新到另一个随机记录。如何在rails中每隔几分钟更改一次变量?

我该如何解决这个问题?

现在我正在寻找cronjobs的方向,也是每当宝石,..但我不是100%肯定我真的需要所有这些似乎是一个非常简单的行动?

回答

1

使用Rails.cache机制。

在你的控制器:

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

第一执行过程中,导致了Rails缓存被缓存。 5分钟后检索新的随机记录。

1

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

0

你可以简单地查看当前的时间在你的控制器,是这样的:

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

这种代码不会扩展到多个服务器(因为它依赖于类变量用于数据存储),所以在实际情况是,您不希望将这两个类变量存储在Redis(甚至是Memcache)中 - 这是为了获得高性能。真正取决于你需要的准确度以及你需要的性能。您也可以使用常规数据库来存储到期时间,然后加载时间最新的记录。

+0

只是一个小的通知,说在这个例子中没有服务器检查。如果您关心安全性,则应该根据服务器存储的值对其进行检查,如模型属性。 – Spyros 2011-03-03 02:21:37

0

我的第一个尝试是将记录缓存在全局中,但最终可能会得到由不同服务器提供的不同记录。如何添加: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 
相关问题