微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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年.

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

原文地址:https://www.jb51.cc/ruby/271641.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐