2017-02-27 45 views
0

我有一個:birth_date型號的date型號。將數據自由格式存入數據庫

我試圖把一個像3 janvier 1968(法語)字符串放入該字段中,並以某種方式在數據庫中看到PostgreSQL或其他人將其轉換爲日期!

我也嘗試了一些其他日期,如3 février 1968或類似3 fevrier 1968哪些沒有工作,結果是在DB dbNULL

我無法在任何地方找到關於此功能的信息。這個怎麼用?

回答

1

如果您在數據庫中有一個類型爲'date'的列,它只會保存爲一個日期。如果可能,Rails最好將字符串轉換爲可識別的日期。您應該始終將「birth_date」數據作爲日期(即使用date_field)。否則,如果您真的想將其作爲字符串存儲,則birth_date列必須是數據庫中的字符串類型

2

Rails從數據庫定義中知道屬性爲Date,因此它將您給它的字符串轉換爲Date。如果您在Rails的控制檯模型的新實例,並分配給birth_date,你也可以說這已經是一個日期,你把它保存到數據庫中,即使前:

m = Model.new # Use your model name 
m.birth_date = "3 février 1968" 
m.birth_date.class 

控制檯應該告訴你,m.birth_date是一個Date

因此,在將模型保存到數據庫之前完成到Date的轉換。 Rails定義了一個調用Ruby ::Date.parse方法的String::to_date方法,該方法將各種可讀的日期字符串轉換爲Datehttps://ruby-doc.org/stdlib-2.3.1/libdoc/date/rdoc/Date.html#method-c-parse)。在Rails源代碼中,您會看到,使用to_date方法將分配給Date屬性的任何內容都轉換爲Date。因此,當您指定String時,它通過String::to_date發生,其調用Date.parse

正如你在你的評論中提到的,Date.parse似乎採取了一個相當寬鬆的方法來解釋他們的月份。我在Date.parse裏嘗試過各種英文,法文和西班牙文月份,只要非英文月份的前三個字母與英文月份相同,Date.parse就會將它們轉換。但是,如果前三個字母不同,則Date.parse會引發錯誤。

+0

我也考慮過語言環境,但是我有'en_US.UTF-8'語言環境。這很奇怪 –

+1

我想我誤解了。是你的問題,「爲什麼Rails將字符串轉換爲日期」,還是「爲什麼Rails將法語日期轉換爲日期,當我的語言環境是英語時」,或者兩者都是? –

+0

兩者。我也在想這個,我有一個想法。像英語一樣,'janvier'以'jan'開頭。 'février'不以'feb'開頭。也許Rails會自動嘗試將字符串轉換爲日期,就像它是某種英文格式的日期一樣。 –

相關問題