加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:40:27 所属栏目:百科 来源:网络整理
导读:如果我在创建新的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如何做这个魔法?
如果我在创建新的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年.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读