2010-07-29 20 views
1

我在測試我的驗證時遇到了這個特質。被定義爲遷移如下:爲什麼Rails將String保存爲null日期時間列?

在IRB

>> t = TimeWindow.new({:window_begin => Time.now, :window_end => "not a time"}) 
=> #<TimeWindow id: nil, window_begin: "2010-07-29 15:54:07", window_end: nil> 

我的問題

create_table :time_windows do |t| 
    t.datetime :window_begin, :null => true 
    t.datetime :window_end, :null => true 
end 

是,爲什麼ActiveRecord的解釋「沒有時間」爲無,而不是僅僅設置:window_end =「沒有時間」?當您將:window_end設置爲int時,也會發生同樣的轉換到零。

對我來說,這是一個問題的原因是,如果有人試圖在window_end(或window_start)列中保存非Time值,我想要拋出一個錯誤,但事實並非如此這裏。

謝謝。

回答

1

首先,數據庫無法在日期時間列中保存字符串。其次,Rails將「不是時間」解釋爲零,因爲你沒有時間價值,即你沒有。

最後,您有責任驗證您的輸入。你可以這樣做:rails built in datetime validation

+0

我認爲我的問題很糟糕的措詞。忘記將其保存到數據庫中一秒鐘。當我在內存中爲window_end屬性創建一個非法(不是Time)值的TimeWindow對象時,它只是用nil爲window_end實例化對象。但是,如果我實例化一個具有以下屬性的不同類型的類:例如integer類型的count,並且assign:count =>「not a number」,則該對象將被實例化爲:count =「not a number」。爲什麼String的翻譯 - >在前一種情況下爲零,而在後者中爲零? – 2010-07-29 20:55:31

+0

整數屬性並非如此。我只是做了以下我的項目之一:u = User.new(:sign_in_count =>「不是一個數字」)[btw,sign_in_count是整數attr],當我打電話給u.sign_in_count時,得到:0。是因爲「不是一個數字」是使用返回0(「不是數字」.to_i => 0)的to_i來鑄造的, – 2010-07-29 23:19:08

相關問題