2011-10-22 86 views
0

我有一些表:Rails ActiveRecord如何將Time.now設置爲NULL?

online | offline 
10:32 | 11:06 
12:28 | 13:04 
14:07 | NULL 

正如你所看到的, - 用戶沒有在脫機時(假設現在是14:15)。我需要獲得所有用戶在線時間。如果用戶目前不在線下 - 我需要獲得差異Time.now - 在線。

在我的Ruby代碼創建功能:

def offline_datetime 
    if offline.nil? then Time.current else offline end 
end 

這是確定的,但如果我有很多的記錄它會這麼慢?我怎樣才能做到這一點通過數據庫?

回答

3

我不認爲這會有什麼區別。即使擁有數百條記錄,您還有另外一項測試是針對每條記錄的零次測試,並且只計算一次'Time.now'。與模型對象的生成相比,幾乎沒有什麼。您可以計算存儲上的差異,然後讓數據庫計算總和。但是我只會在必要時做到這一點(如果它沒有損壞,不要調整性能)。

編輯 如果計算在線時間很多次的總和,你應該存儲離線時間戳記計算在線時間前期:

  1. 添加由遷移屬性diffinteger以分鐘爲單位的差異。
  2. 存儲脫機時間戳時,計算差異並將其存儲在一起。
  3. 通過調用添加的款項:Model.sum("diff")
  4. 加入,唯一的記錄(有可能是隻有在你的例子之一)作爲@davidb寫在他的解決方案。
+1

在數據庫可以更快和/或更好地完成數據庫操作時,Dude對ruby中的事物並不好。當我們談論數百甚至數千數據集的時候,因爲你的權利並不重要,但是當你達到更高層次時,你可能會遇到一些問題,所以最好從第一天開始,而不是現在的應用程序就像一個fusee一樣慢。 – davidb

+0

我不同意你的看法。要在Ruby中有足夠快的解決方案,開發和維護起來要容易得多。舉個例子,我沒有看到你有數百萬條記錄(從離線切換到在線),所以不,如果沒有必要,不要優化。吻! – mliebelt

+0

是的,因爲這很容易,但我不認爲在紅寶石包括兩個SQL命令的解決方案是可怕的維護。它仍然是ActiveRecord,沒有令人毛骨悚然的純SQL。 – davidb

1

我認爲在這個位置,這將是easyes解決方案做兩個查詢。一個排除了離線空值的數據集和一個只抓取這些數據集的數據集。然後你可以使用CURRENT_TIMESTAMP變量(它總是包含了實際時間timestmap)的MySQL這樣的:

Model.where("offline IS NULL").sum("CURRENT_TIMESTAMP-online") 

那麼你可以添加在第一和謝勝利,查詢的結果。也許做方法的功能出來的:

def self.your_method_name_here 
    secounds=0 
    secounds+=Model.where("offline IS NOT NULL").sum("offline-online").to_i 
    secounds+=Model.where("ofline IS NULL").sum("CURRENT_TIMESTAMP-online").to_i 
    secounds 
end 

可能可以做到這一點在一個查詢,但我認爲這是退出practable!

+0

謝謝!我馬上試試這個。 – ValeriiVasin

+0

似乎一切正常,但離線的差異 - 在線目前不在秒內:(任何suggessions? – ValeriiVasin

+0

添加了一些更改忘記.to_i – davidb