Это происходит, если вы делаете это для любого месяца, у которого нет 31 дня (то есть 3 месяца будут работать нормально, но 1 месяц, или 6, или 8 все это сделает).
Если вы сделаете Date.today - 1.month
, похоже, что Rails увидит, что 31.09.2011 не является действительной датой, поэтому он отбрасывает ее на дополнительный день, чтобы сделать ее действительной.Тем не менее, когда вы продвинетесь на месяц вперед с конца сентября, он останется на 30.10.2011, поскольку это действительная дата.По сути, Rails просто пытается увеличить (или уменьшить) поле месяца, и пока оно является действительной датой, оно не будет корректировать поле дня.
Один из способов обойти это - использовать .end_of_month
(или .beginning_of_month
) метод для Date
объекта в Rails, чтобы убедиться, что вы последовательно получаете конец или начало месяца.