diff options
author | Pablo Herrero <pablodherrero@gmail.com> | 2015-04-23 16:33:23 -0300 |
---|---|---|
committer | Pablo Herrero <pablodherrero@gmail.com> | 2015-05-04 08:06:52 -0300 |
commit | bbe7b7f504ea5010712ee37d84f8c86682dd14f8 (patch) | |
tree | baead3282de4b044960862f81900fddcb3982105 /activesupport/lib/active_support/core_ext/time/operators.rb | |
parent | 21c74bd769f6c873453e9244b0de7ced40a532be (diff) | |
download | rails-bbe7b7f504ea5010712ee37d84f8c86682dd14f8.tar.gz rails-bbe7b7f504ea5010712ee37d84f8c86682dd14f8.tar.bz2 rails-bbe7b7f504ea5010712ee37d84f8c86682dd14f8.zip |
Replace use of alias chains with prepend at core_ext/date
Diffstat (limited to 'activesupport/lib/active_support/core_ext/time/operators.rb')
-rw-r--r-- | activesupport/lib/active_support/core_ext/time/operators.rb | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/core_ext/time/operators.rb b/activesupport/lib/active_support/core_ext/time/operators.rb new file mode 100644 index 0000000000..161304dcb3 --- /dev/null +++ b/activesupport/lib/active_support/core_ext/time/operators.rb @@ -0,0 +1,36 @@ +require 'active_support/core_ext/date_and_time/with_duration' + +module ActiveSupport + module TimeOperators # :nodoc: + include DateAndTime::WithDuration + + # Layers additional behavior on Time#<=> so that DateTime and ActiveSupport::TimeWithZone instances + # can be chronologically compared with a Time + def <=>(other) + # we're avoiding Time#to_datetime and Time#to_time because they're expensive + if other.class == Time + super + elsif other.is_a?(Time) + super(other.to_time) + else + to_datetime <=> other + end + end + + # Layers additional behavior on Time#eql? so that ActiveSupport::TimeWithZone instances + # can be eql? to an equivalent Time + def eql?(other) + # if other is an ActiveSupport::TimeWithZone, coerce a Time instance from it so we can do eql? comparison + other = other.comparable_time if other.respond_to?(:comparable_time) + super + end + + # Time#- can also be used to determine the number of seconds between two Time instances. + # We're layering on additional behavior so that ActiveSupport::TimeWithZone instances + # are coerced into values that Time#- will recognize + def -(other) + other = other.comparable_time if other.respond_to?(:comparable_time) + other.is_a?(DateTime) ? to_f - other.to_f : super + end + end +end |