如果我在创建新的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年.