ruby-on-rails – ActiveRecord解析字符串到datetime?

如果我在创建新的AR对象时将String传递给Datetime列,它将自动解析:
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>

Rails或ActiveRecord如何做这个魔法?它使用哪种方法

解决方法

Rails为String添加一个 to_date方法.其来源很简单:
# 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

Date._parse是Ruby的原生(相同的方法由Date.parse调用),它是where the real work is done.

它首先使用正则表达式从字符串中除去无关的符号,然后将其传递给其他方法,如_parse_eu,_parse_iso,_parse_dot等.它们中的每一个都使用自己的正则表达式和其他方法来查看它是否是它理解的日期,并从中提取有意义的信息.一旦其中一个“工作”(即返回true),其余的将被跳过.最后,在_parse中,提取的信息用于建立日期和时间,再做一些更多的工作来计算一周中的日子,以及“12”的年值是否应该是1912年或2012年.

文档称之为启发式方法,这可以被认为意味着它会在墙上抛出一堆可能性来看看是什么.它的文件很差,但效果非常好.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...