ActiveRecord разбирает строку в datetime? - PullRequest
14 голосов
/ 15 марта 2012

Если я передам String в Datetime столбец при создании нового объекта AR, он будет автоматически проанализирован:

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 делает это волшебство? Какой метод он использует?

Ответы [ 4 ]

18 голосов
/ 15 марта 2012

Rails добавляет to_date метод к String. Его источник прост:

# 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), и это , где выполняется настоящая работа .

Сначала оно использует регулярное выражение для удаления посторонних символов из строки, затем передает его другим методам, таким как _parse_eu, _parse_iso, _parse_dot и так далее. Каждый из них использует свои собственные регулярные выражения и другие методы, чтобы увидеть, понимает ли это дату, и извлечь из нее значимую информацию. Как только один из них «работает» (т. Е. Возвращает true), остальные пропускаются. Наконец, в _parse извлеченная информация используется для построения даты и времени, делая немного больше работы, чтобы выяснить такие вещи, как проверка дня недели и того, должно ли значение года «12» означать 1912 или 2012

В документах это называют эвристическим методом, который можно использовать для обозначения того, что он бросает кучу возможностей в стену, чтобы посмотреть, что прилипает. Это довольно плохо документировано, но работает замечательно хорошо.

2 голосов
/ 24 марта 2015

Там также to_datetime, если вам нужно время.

1 голос
/ 15 марта 2012

Вы, вероятно, хотите использовать Date.strptime(str).

0 голосов
/ 21 сентября 2017

Как показывают другие комментарии и документация, String # to_datetime"Преобразует строку в значение DateTime.":

"1-1-2012".to_datetime            # => Sun, 01 Jan 2012 00:00:00 +0000 
"01/01/2012 23:59:59".to_datetime # => Sun, 01 Jan 2012 23:59:59 +0000 
"2012-12-13 12:50".to_datetime    # => Thu, 13 Dec 2012 12:50:00 +0000 
"12/13/2012".to_datetime          # => ArgumentError: invalid date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...