Class: Mongoid::Tracking::ReaderExtender

Inherits:
Object
  • Object
show all
Defined in:
lib/mongoid/tracking/reader_extender.rb

Overview

ReaderExtender is used in cases where we need to return an integer (class Numeric) while extending their contents. It would allow to perform advanced calculations in some situations:

Example:

a = visits.today   # Would return a number, but "extended" so that
                   # we can make a.hourly to get a detailed, hourly
                   # array of the visits.

b = visits.yesterday
c = a + b          # Here, in c, normally we would have a FixNum with
                   # the sum of a plus b, but if we extend the sum
                   # operation, we can additionaly sum the hourly
                   # array and return a new ReaderExtender c.

Instance Method Summary collapse

Constructor Details

#initialize(number, hours) ⇒ ReaderExtender

Returns a new instance of ReaderExtender.



22
23
24
25
# File 'lib/mongoid/tracking/reader_extender.rb', line 22

def initialize(number, hours)
  @total = number
  @hours = hours
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &blk) ⇒ Object

Solution proposed by Yehuda Katz in the following Stack Overflow: stackoverflow.com/questions/1095789/sub-classing-fixnum-in-ruby

Basically we override our methods while proxying all missing methods to the underliying FixNum



62
63
64
65
# File 'lib/mongoid/tracking/reader_extender.rb', line 62

def method_missing(name, *args, &blk)
  ret = @total.send(name, *args, &blk)
  ret.is_a?(Numeric) ? ReaderExtender.new(ret, @hours) : ret
end

Instance Method Details

#+(other) ⇒ Object



47
48
49
50
# File 'lib/mongoid/tracking/reader_extender.rb', line 47

def +(other)
  return @total + other unless other.is_a?(ReaderExtender)
  self.class.new(@total + other, @hours.zip(other.hourly).map!(&:sum))
end

#<=>(other) ⇒ Object



43
44
45
# File 'lib/mongoid/tracking/reader_extender.rb', line 43

def <=>(other)
  @total <=> other
end

#==(other) ⇒ Object



39
40
41
# File 'lib/mongoid/tracking/reader_extender.rb', line 39

def ==(other)
  @total == other
end

#as_json(options = nil) ⇒ Object



52
53
54
# File 'lib/mongoid/tracking/reader_extender.rb', line 52

def as_json(options = nil)
  @total
end

#hourlyObject



27
28
29
# File 'lib/mongoid/tracking/reader_extender.rb', line 27

def hourly
  @hours
end

#to_fObject



35
36
37
# File 'lib/mongoid/tracking/reader_extender.rb', line 35

def to_f
  @total.to_f
end

#to_sObject



31
32
33
# File 'lib/mongoid/tracking/reader_extender.rb', line 31

def to_s
  @total.to_s
end