Lai*_*uan 14 activerecord datetime ruby-on-rails
如果我通过String到Datetime列,同时创造新的AR对象时,它会自动解析:
1.9.2p290 :011 > Movie.new(:release_date=>"21-Nov-1990")
=> #<Movie id: nil, release_date: "1990-11-21 00:00:00", created_at: nil, updated_at: nil>
Run Code Online (Sandbox Code Playgroud)
怎么做Rails,或者ActiveRecord做这个魔术?它使用哪种方法?
Jor*_*ing 18
Rails添加了一个to_date方法String.它的来源很简单:
# File activesupport/lib/active_support/core_ext/string/conversions.rb, line 42
def to_date
return nil if self.blank?
::Date.new(*::Date._parse(self, false).values_at(:year, :mon, :mday))
end
Run Code Online (Sandbox Code Playgroud)
Date._parse是Ruby的原生(相同的方法被称为Date.parse),它是真正的工作完成的地方.
它首先使用正则表达式来从字符串中删除多余的符号,然后将其传递给其他方法,如_parse_eu,_parse_iso,_parse_dot等.这些中的每一个都使用自己的正则表达式和其他方法来查看它是否是它理解的日期并从中提取有意义的信息.一旦其中一个"工作"(即返回true),其余部分将被跳过.最后,回来后_parse,提取的信息用于建立日期和时间,做一些工作来弄清楚诸如检查星期几以及年份值"12"是否应该表示1912或2012的事情.
文档称这是一种启发式方法,可以理解为它会在墙上抛出一堆可能性以查看是什么.它的记录很差,但效果非常好.
| 归档时间: |
|
| 查看次数: |
8601 次 |
| 最近记录: |