Class: Ardb::RelationSpy

Inherits:
Object
  • Object
show all
Defined in:
lib/ardb/relation_spy.rb

Defined Under Namespace

Classes: AppliedExpression

Constant Summary collapse

NotFoundError =
Class.new(RuntimeError)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRelationSpy

Returns a new instance of RelationSpy.



9
10
11
12
# File 'lib/ardb/relation_spy.rb', line 9

def initialize
  @applied, @results = [], []
  @offset_value, @limit_value = nil, nil
end

Instance Attribute Details

#appliedObject (readonly)

Returns the value of attribute applied.



5
6
7
# File 'lib/ardb/relation_spy.rb', line 5

def applied
  @applied
end

#limit_valueObject

Returns the value of attribute limit_value.



6
7
8
# File 'lib/ardb/relation_spy.rb', line 6

def limit_value
  @limit_value
end

#offset_valueObject

Returns the value of attribute offset_value.



6
7
8
# File 'lib/ardb/relation_spy.rb', line 6

def offset_value
  @offset_value
end

#resultsObject

Returns the value of attribute results.



7
8
9
# File 'lib/ardb/relation_spy.rb', line 7

def results
  @results
end

Instance Method Details

#==(other) ⇒ Object



20
21
22
# File 'lib/ardb/relation_spy.rb', line 20

def ==(other)
  other.kind_of?(self.class) ? @applied == other.applied : super
end

#allObject



111
112
113
# File 'lib/ardb/relation_spy.rb', line 111

def all
  @results[(@offset_value || 0), (@limit_value || @results.size)] || []
end

#countObject

ActiveRecord::Calculations



117
118
119
# File 'lib/ardb/relation_spy.rb', line 117

def count
  all.size
end

#except(*skips) ⇒ Object



70
71
72
73
74
75
76
77
# File 'lib/ardb/relation_spy.rb', line 70

def except(*skips)
  skips = skips.map(&:to_sym)
  self.dup.tap do |r|
    r.applied.reject!{ |a| skips.include?(a.type) }
    r.limit_value    = nil if skips.include?(:limit)
    r.offset_value   = nil if skips.include?(:offset)
  end
end

#find(id) ⇒ Object

ActiveRecord::FinderMethods



90
91
92
93
# File 'lib/ardb/relation_spy.rb', line 90

def find(id)
  record = @results.detect{ |result| result.id == id }
  record || raise(NotFoundError)
end

#firstObject



95
96
97
# File 'lib/ardb/relation_spy.rb', line 95

def first
  self.all.first
end

#first!Object



99
100
101
# File 'lib/ardb/relation_spy.rb', line 99

def first!
  self.first || raise(NotFoundError)
end

#initialize_copy(copied_from) ⇒ Object



14
15
16
17
18
# File 'lib/ardb/relation_spy.rb', line 14

def initialize_copy(copied_from)
  super
  @applied = copied_from.applied.dup
  @results = copied_from.results.dup
end

#lastObject



103
104
105
# File 'lib/ardb/relation_spy.rb', line 103

def last
  self.all.last
end

#last!Object



107
108
109
# File 'lib/ardb/relation_spy.rb', line 107

def last!
  self.last || raise(NotFoundError)
end

#limit(value) ⇒ Object



46
47
48
49
50
# File 'lib/ardb/relation_spy.rb', line 46

def limit(value)
  @limit_value = value ? value.to_i : nil
  @applied << AppliedExpression.new(:limit, [ value ])
  self
end

#merge(other) ⇒ Object

ActiveRecord::SpawnMethods



60
61
62
63
64
65
66
67
68
# File 'lib/ardb/relation_spy.rb', line 60

def merge(other)
  return self if self.equal?(other)
  if other.kind_of?(self.class)
    other.applied.each{ |a| self.send(a.type, *a.args) }
  else
    @applied << AppliedExpression.new(:merge, [ other ])
  end
  self
end

#offset(value) ⇒ Object



52
53
54
55
56
# File 'lib/ardb/relation_spy.rb', line 52

def offset(value)
  @offset_value = value ? value.to_i : nil
  @applied << AppliedExpression.new(:offset, [ value ])
  self
end

#only(*onlies) ⇒ Object



79
80
81
82
83
84
85
86
# File 'lib/ardb/relation_spy.rb', line 79

def only(*onlies)
  onlies = onlies.map(&:to_sym)
  self.dup.tap do |r|
    r.applied.reject!{ |a| !onlies.include?(a.type) }
    r.limit_value    = nil unless onlies.include?(:limit)
    r.offset_value   = nil unless onlies.include?(:offset)
  end
end

#to_sqlObject



24
25
26
# File 'lib/ardb/relation_spy.rb', line 24

def to_sql
  @applied.map(&:to_sql).join(", ")
end