2010-07-26 25 views
5

我運行時遇到了一個我認爲是Active Records錯誤的問題。我正在解析包含作業的XML文件。此xml文件包含以時間格式00:00:00表示walltime的節點。我也有一個模型可以接受這些工作。但是,當時間大於實際24小時時,Active記錄會將其插入爲NULL。示例如下:使用Ruby on Rails將時間插入到時間列中

INSERT INTO `jobs` (`jobid`, `walltime`) VALUES('71413', 'NULL') 

INSERT INTO `jobs` (`jobid`, `walltime`) VALUES('71413', '15:24:10') 

任何想法?謝謝!

+0

您的問題請你詳細解釋究竟是什麼?它給錯誤的東西? – Salil 2010-07-26 09:37:23

+0

數據庫中的'walltime'配置爲接受varchar或text嗎?或者它是一些神奇的格式化時間類型? (如果這是我的應用程序,我會將秒數作爲整數存儲在數據庫中,並將其格式化爲視圖。) – sarnold 2010-07-26 09:48:40

+1

在哪個數據庫上運行它?如果它是MySQL並且walltime屬性是Time類型的,那麼這可能是一個有趣的捕獲,因爲MySQL能夠通過Time類型處理已用時間,在這種情況下,ActiveRecord不應該將walltime屬性強制爲NULL。 – 2010-07-26 10:00:29

回答

5

標準 SQL timedatetime數據類型不用於存儲持續時間。可能與這些標準一致,ActiveRecord's time attribute assignment logic使用time parsing rules of the native Ruby Time class來拒絕無效的時間。

存儲的持續時間,如打算的方式,可以是:

  1. 存儲的持續時間爲一個整數(例如,「若干秒」),或
  2. 存儲兩個(日期)次,開始和結束,並使用日期算法。
class Thing < ActiveRecord::Base 
    ... 
    def duration 
    return start - end 
    end 

    def duration=(length) 
    start = Time.now 
    end = start + length 
    end 
    ... 
end 
+1

這不是MySQl的情況(不知道其他實現)。請參閱http://dev.mysql.com/doc/refman/5.0/en/time.html(「...值的範圍可以從'-838:59:59'到'838:59:59'。小時部分可能非常大,因爲TIME類型不僅可用於表示一天中的時間(必須小於24小時),還可用於表示兩個事件之間的時間間隔或時間間隔(可能遠遠大於24小時,甚至是否定的)。「) – 2010-07-26 10:07:01

+0

Hi Milan - 是的,MySql很可能支持持續時間 - 存儲時間列 - 但由於Active Record旨在交叉數據庫兼容 - 它可能仍然」有助於「解釋時間作爲一個只有時鐘的時間。因此,它將繼續將任何被視爲「無效時間」的事情置零。因此,這裏的持續時間選項可能是確保實際工作的更好選擇。 – 2010-08-02 16:15:46

+1

@Taryn根據我們的懷疑,我找到了完全相同的代碼。 – 2010-08-02 23:19:49