aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel
diff options
context:
space:
mode:
authorSean Griffin <sean@seantheprogrammer.com>2015-09-23 09:01:38 -0600
committerSean Griffin <sean@seantheprogrammer.com>2015-09-23 09:01:38 -0600
commit66337b62ad5fe8004394608584baff137f4cc93e (patch)
tree184c61660e43fa78f2013f0910120d300a758fe5 /activemodel
parentf5fe01e8366ae393aca93635a8f04d4ed3f7cdd7 (diff)
parentd03f5196657bf466d7576cd6cbd4886db030723b (diff)
downloadrails-66337b62ad5fe8004394608584baff137f4cc93e.tar.gz
rails-66337b62ad5fe8004394608584baff137f4cc93e.tar.bz2
rails-66337b62ad5fe8004394608584baff137f4cc93e.zip
Merge pull request #20317
AR: take precision into count when assigning a value to timestamp attribute
Diffstat (limited to 'activemodel')
-rw-r--r--activemodel/lib/active_model/type/date_time.rb8
-rw-r--r--activemodel/lib/active_model/type/helpers/time_value.rb13
2 files changed, 12 insertions, 9 deletions
diff --git a/activemodel/lib/active_model/type/date_time.rb b/activemodel/lib/active_model/type/date_time.rb
index b068cfc672..2f2df4320f 100644
--- a/activemodel/lib/active_model/type/date_time.rb
+++ b/activemodel/lib/active_model/type/date_time.rb
@@ -12,11 +12,11 @@ module ActiveModel
private
- def cast_value(string)
- return string unless string.is_a?(::String)
- return if string.empty?
+ def cast_value(value)
+ return apply_seconds_precision(value) unless value.is_a?(::String)
+ return if value.empty?
- fast_string_to_time(string) || fallback_string_to_time(string)
+ fast_string_to_time(value) || fallback_string_to_time(value)
end
# '0.123456' -> 123456
diff --git a/activemodel/lib/active_model/type/helpers/time_value.rb b/activemodel/lib/active_model/type/helpers/time_value.rb
index 0a0e58654b..63993c0d93 100644
--- a/activemodel/lib/active_model/type/helpers/time_value.rb
+++ b/activemodel/lib/active_model/type/helpers/time_value.rb
@@ -5,11 +5,7 @@ module ActiveModel
module Helpers
module TimeValue # :nodoc:
def serialize(value)
- if precision && value.respond_to?(:usec)
- number_of_insignificant_digits = 6 - precision
- round_power = 10 ** number_of_insignificant_digits
- value = value.change(usec: value.usec / round_power * round_power)
- end
+ value = apply_seconds_precision(value)
if value.acts_like?(:time)
zone_conversion_method = is_utc? ? :getutc : :getlocal
@@ -34,6 +30,13 @@ module ActiveModel
end
end
+ def apply_seconds_precision(value)
+ return value unless precision && value.respond_to?(:usec)
+ number_of_insignificant_digits = 6 - precision
+ round_power = 10 ** number_of_insignificant_digits
+ value.change(usec: value.usec / round_power * round_power)
+ end
+
def type_cast_for_schema(value)
"'#{value.to_s(:db)}'"
end