我有一个:birth_date
类型为date
的模型。
我试图将像3 janvier 1968
(法语)这样的字符串放入该字段中,不知何故,在数据库中我看到 PostgreSQL 或其他人将其转换为日期!
我还尝试了其他一些日期,例如3 février 1968
或类似3 fevrier 1968
,这些日期不起作用,结果在数据库中NULL
。
我在任何地方都找不到有关此功能的信息。这是如何工作的?
Rails 知道该属性是数据库定义的Date
,因此它会将您提供给它的字符串转换为Date
。如果在 Rails 控制台中创建模型的新实例并分配给birth_date
,则可以在将模型保存到数据库之前证明它已经是 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
方法,该方法将各种人类可读的日期字符串转换为Date
(https://ruby-doc.org/stdlib-2.3.1/libdoc/date/rdoc/Date.html#method-c-parse)。在 Rails 源代码中,您将看到分配给Date
属性的任何内容都使用to_date
方法转换为Date
。因此,当您分配String
时,它会通过调用Date.parse
的String::to_date
发生。
正如您在评论中提到的,Date.parse
似乎对拼写它们的月份采取了相当宽松的方法。我在Date.parse
尝试了各种英语、法语和西班牙语月份,只要非英语月份的前三个字母与英语月份相同,Date.parse
就会转换它们。但是,如果前三个字母不同,则Date.parse
抛出错误。
如果数据库中有一列类型为"date",则它只会另存为日期。 如果可能的话,Rails 最好将字符串转换为可识别的日期。 您应该始终将"birth_date"数据作为日期传递(即使用date_field)。 否则,如果您确实想将其存储为字符串,则birth_date列必须是数据库中的字符串类型