2011-03-03 92 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 
相關問題