EDIT: Spójrz na this question zanim zdecydujesz się na stosowanie metody Mam opisaną tutaj. Wydaje się, że nie jest najlepszą praktyką modyfikowanie zachowania klasy bazowej w Ruby (co mogę zrozumieć). Więc, weź tę odpowiedź z przymrużeniem oka ...
MattW's answer był pierwszą rzeczą, myślałem, ale ja też nie lubię go bardzo dużo.
Przypuszczam, że można uczynić go mniej brzydki przez łatanie DateTime
i Fixnum
robić to, co chcesz:
require 'date'
# A placeholder class for holding a set number of hours.
# Used so we can know when to change the behavior
# of DateTime#-() by recognizing when hours are explicitly passed in.
class Hours
attr_reader :value
def initialize(value)
@value = value
end
end
# Patch the #-() method to handle subtracting hours
# in addition to what it normally does
class DateTime
alias old_subtract -
def -(x)
case x
when Hours; return DateTime.new(year, month, day, hour-x.value, min, sec)
else; return self.old_subtract(x)
end
end
end
# Add an #hours attribute to Fixnum that returns an Hours object.
# This is for syntactic sugar, allowing you to write "someDate - 4.hours" for example
class Fixnum
def hours
Hours.new(self)
end
end
Następnie można napisać kod tak:
some_date = some_date - n.hours
gdzie n
jest liczba godzin, które chcesz odjąć od some_date
Należy pamiętać, że działa to tylko w kontekście Rails. Metoda hours() pochodzi od jednego z pomocników daty w Railsach, nie od standardowej biblioteki języka Ruby. –
To frustrujące, jak wiele osób myśli, że Ruby = Railsy –