日期以自由格式转换为数据库



我有一个: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.parseString::to_date发生。

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

如果数据库中有一列类型为"date",则它只会另存为日期。 如果可能的话,Rails 最好将字符串转换为可识别的日期。 您应该始终将"birth_date"数据作为日期传递(即使用date_field)。 否则,如果您确实想将其存储为字符串,则birth_date列必须是数据库中的字符串类型

最新更新