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

前端之家收集整理的这篇文章主要介绍了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年.

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

猜你在找的Ruby相关文章