我想在數據庫中顯示一段隨機記錄一段時間,之後它會刷新到另一個隨機記錄。如何在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