Бог возиться с датой операций - PullRequest
2 голосов
/ 01 октября 2011

Это утомленная мысль.Следуйте моим шагам:

Без бога, на консоли:

> d=Date.parse("2010-02-01")
=> Mon, 01 Feb 2010
> d+1.day
=> Tue, 02 Feb 2010

Perfect.

Затем я иду в свой Gemfile и добавляю

gem 'god'

и запустите

bundle install

После этого снова на консоли:

> d=Date.parse("2010-02-01")
=> Mon, 01 Feb 2010 
> d+1.day
=> Sun, 23 Aug 2246

Знаете ли вы, что может произойти?

Ответы [ 3 ]

2 голосов
/ 01 октября 2011

Странно, что это происходит в консоли.Я мог бы понять это в других сценариях, где 1.day используется в качестве входных данных в одном месте и извлекается для использования в другом месте, поскольку 1.day - это Fixnum 86400 с некоторыми специальными метаданными (#steps), смешанными в нем.

Date относится, например, + 1 к значению «добавить один день».Rails добавляет некоторое поведение, так что он понимает вещь 1.day (86400 "секунд", но с step из [1, :days]), что на самом деле означает + 1 вместо + 86400.Вот что вы теряете:

ruby-1.9.2-p290 :171 > d = Date.parse("2010-02-01")
 => #<Date: 2010-02-01 (4910457/2,0,2299161)> 
ruby-1.9.2-p290 :172 > d + 86400
 => #<Date: 2246-08-23 (5083257/2,0,2299161)> 
ruby-1.9.2-p290 :173 > 

Таким образом, значение 1.day интерпретируется как Fixnum, а не Fixnum с ActiveSupport::Duration.

irb(main):001:0> Date.parse("2010-02-01") + 1.day.to_i
=> Sun, 23 Aug 2246

Так что есливы используете это значение 1.day в контексте, где оно не используется немедленно, не ... вместо этого используйте Fixnum 1;)

1 голос
/ 25 января 2012

"бог" делает беспорядок Даты. Это проблема с "богом". Драгоценный камень, используемый с Rails, не должен изменять соглашения Rails. Если Date.current - 4.days делает одну вещь без «бога», то он должен делать это с «богом». Период.

0 голосов
/ 16 апреля 2012

Согласно открытой проблеме GitHub , я попробовал это решение:

Gemfile

gem 'god', :require => false

Вместо:

gem 'god'

Кажется, все снова работает:

1.9.3p0 :001 > d = Date.parse('2012-04-16')
 => Mon, 16 Apr 2012 
1.9.3p0 :002 > d + 1.day
 => Tue, 17 Apr 2012 
...