我的模型:birth_date
类型为date
。
我试图将3 janvier 1968
(法语)这样的字符串放到该字段中,不知何故,在数据库中我看到PostgreSQL或其他人将其转换为日期!
我还尝试了其他一些日期,例如3 février 1968
或类似3 fevrier 1968
,但这些日期在db中无法正常工作,结果为NULL
。
我无法在任何地方找到有关此功能的信息。这是如何工作的?
答案 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_date
是Date
。
因此,在将模型保存到数据库之前,已完成到Date
的转换。 Rails定义了一个调用Ruby String::to_date
方法的::Date.parse
方法,该方法将各种人类可读的日期字符串转换为Date
(https://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类型