我有一个 :birth_date
类型为 date
的模型。
我尝试将 3 janvier 1968
(法语)之类的字符串放入该字段,然后在数据库中我看到 PostgreSQL 或其他人以某种方式将其转换为日期!
我还尝试了一些其他日期,例如 3 février 1968
或 3 fevrier 1968
没有用,结果是 NULL
在数据库中。
我在任何地方都找不到有关此功能的信息。这是如何工作的?
最佳答案
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
方法,该方法将各种人类可读的日期字符串转换为 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
会抛出错误。
关于ruby-on-rails - 自由格式的日期到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42494908/