EDITAR: Tome un vistazo a this question antes de decidirse a utilizar el enfoque que he descrito aquí. Parece que no es una buena práctica modificar el comportamiento de una clase base en Ruby (que puedo entender). Por lo tanto, aprovechar esta respuesta con un grano de sal ...
MattW's answer fue lo primero que pensé, pero tampoco me gusta mucho.
supongo que podría hacerlo menos fea mediante parches DateTime
y Fixnum
a hacer lo que quiera:
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
Entonces se puede escribir el código como el siguiente:
some_date = some_date - n.hours
donde n
es el número de horas que desea restar de some_date
Tenga en cuenta que esto solo funciona en el contexto de Rails. El método hours() proviene de uno de los ayudantes de fecha en Rails que no proviene de la lib estándar de Ruby. –
Es frustrante cómo tanta gente piensa Rubí = rieles –