以自由格式进入db的日期

时间:2017-02-27 20:12:21

标签: ruby-on-rails postgresql ruby-on-rails-5

我的模型:birth_date类型为date

我试图将3 janvier 1968(法语)这样的字符串放到该字段中,不知何故,在数据库中我看到PostgreSQL或其他人将其转换为日期!

我还尝试了其他一些日期,例如3 février 1968或类似3 fevrier 1968,但这些日期在db中无法正常工作,结果为NULL

我无法在任何地方找到有关此功能的信息。这是如何工作的?

2 个答案:

答案 0 :(得分: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_dateDate

因此,在将模型保存到数据库之前,已完成到Date的转换。 Rails定义了一个调用Ruby String::to_date方法的::Date.parse方法,该方法将各种人类可读的日期字符串转换为Datehttps://ruby-doc.org/stdlib-2.3.1/libdoc/date/rdoc/Date.html#method-c-parse)。在Rails源代码中,您会看到分配给Date属性的任何内容都会使用Date方法转换为to_date。因此,当您指定String时,会通过String::to_date调用Date.parse

正如您在评论中提到的那样,Date.parse似乎采取了一种相当松散的方式来解决它们被拼写出来的月份。我在Date.parse尝试了各种英语,法语和西班牙语月份,只要非英语月份的前三个字母与英语月份相同,Date.parse就会转换它们。但如果前三个字母不同,则Date.parse会抛出错误。

答案 1 :(得分:1)

如果您在数据库中有一个类型为' date',它将仅保存为日期。如果可能的话,Rails最好将字符串转换为可识别的日期。你应该总是通过'birth_date'数据作为日期(即使用date_field)。否则,如果您真的想将其存储为字符串,则birth_date列必须是数据库中的string类型