ruby-on-rails - 自由格式的日期到数据库

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

我有一个 :birth_date 类型为 date 的模型。

我尝试将 3 janvier 1968(法语)之类的字符串放入该字段,然后在数据库中我看到 PostgreSQL 或其他人以某种方式将其转换为日期!

我还尝试了一些其他日期,例如 3 février 19683 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.parseString::to_date 发生。

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

关于ruby-on-rails - 自由格式的日期到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42494908/

相关文章:

ruby-on-rails - 载波拇指问题

ruby-on-rails - Ruby Time.now 和其他日期

ruby-on-rails - rails 5 : find_or_create_by not saving all the params

ios - 让服务器后端告诉 iOS 应用程序更新数据

postgresql - postgreSQL中带游标的函数

postgresql - 使用 sequelize 切换 bool 列

java - 使用 PostgreSQL,为什么 Hibernate/JPA 不创建级联约束?

ruby-on-rails - 删除Sidekiq中的所有计划任务

ruby-on-rails - 如何在 Rails 5 中创建 ActiveRecord 无表模型?

ruby-on-rails - 设计注册功能