提交 eb73dfc0 编写于 作者: S Sayan Chakraborty

Return correct date in ActiveModel for time to date conversions

time.to_date conversion happens considering leap years
so a conversion of "Day.new({'day(1i)'=>'1', 'day(2i)'=>'1', 'day(3i)'=>'1'})" results in saving the date as Mon, 03 Jan 0001
which might seem weird on the user level, hence falling back to parsing on string level resolves this data mismatch
Fixes #28521
上级 de354cc3
## Rails 5.2.0.beta2 (November 28, 2017) ##
* No changes.
* Return correct date while converting parameters in `value_from_multiparameter_assignment`
for `ActiveModel::Type::Date`
Before:
Day.new({"day(1i)"=>"1", "day(2i)"=>"1", "day(3i)"=>"1"})
=> #<Day id: nil, day: "0001-01-03", created_at: nil, updated_at: nil>
After:
Day.new({"day(1i)"=>"1", "day(2i)"=>"1", "day(3i)"=>"1"})
=> #<Day id: nil, day: "0001-01-01", created_at: nil, updated_at: nil>
Fixes #28521
*Sayan Chakraborty*
## Rails 5.2.0.beta1 (November 27, 2017) ##
......
......@@ -17,6 +17,18 @@ def type_cast_for_schema(value)
value.to_s(:db).inspect
end
def is_utc?
::Time.zone_default.nil? || ::Time.zone_default =~ "UTC"
end
def default_timezone
if is_utc?
:utc
else
:local
end
end
private
def cast_value(value)
......@@ -49,7 +61,7 @@ def new_date(year, mon, mday)
def value_from_multiparameter_assignment(*)
time = super
time && time.to_date
time && new_date(time.year, time.mon, time.mday)
end
end
end
......
......@@ -15,6 +15,17 @@ def test_type_cast_date
date_string = ::Time.now.utc.strftime("%F")
assert_equal date_string, type.cast(date_string).strftime("%F")
end
def test_returns_correct_year
type = Type::Date.new
time = ::Time.utc(1, 1, 1)
date = ::Date.new(time.year, time.mon, time.mday)
values_hash_for_multiparameter_assignment = { 1 => 1, 2 => 1, 3 => 1 }
assert_equal date, type.cast(values_hash_for_multiparameter_assignment)
end
end
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册