Class: ActiveModel::Relation

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/active_model/relation.rb,
lib/active_model/relation/model.rb,
lib/active_model/relation/scoping.rb,
lib/active_model/relation/version.rb,
lib/active_model/relation/querying.rb,
lib/active_model/relation/where_chain.rb,
lib/active_model/relation/order_clause.rb,
lib/active_model/relation/where_clause.rb

Overview

Active Model Relation

Defined Under Namespace

Modules: Model, Querying, Scoping Classes: OrderClause, WhereChain, WhereClause

Constant Summary collapse

VERSION =
'0.2.0'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model, records = model.try(:records) || []) ⇒ Relation

Returns a new instance of Relation.



32
33
34
35
36
37
38
39
40
# File 'lib/active_model/relation.rb', line 32

def initialize(model, records = model.try(:records) || [])
  @model = model
  @records = records
  @where_clause = WhereClause.new
  @order_clause = OrderClause.new
  @offset_value = nil
  @limit_value = nil
  @extending_values = []
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missingObject (private)



152
153
154
155
156
157
158
# File 'lib/active_model/relation.rb', line 152

def method_missing(...)
  if model.respond_to?(...)
    scoping { model.public_send(...) }
  else
    super
  end
end

Instance Attribute Details

#extending_valuesObject

Returns the value of attribute extending_values.



28
29
30
# File 'lib/active_model/relation.rb', line 28

def extending_values
  @extending_values
end

#limit_valueObject

Returns the value of attribute limit_value.



28
29
30
# File 'lib/active_model/relation.rb', line 28

def limit_value
  @limit_value
end

#modelObject (readonly)

Returns the value of attribute model.



27
28
29
# File 'lib/active_model/relation.rb', line 27

def model
  @model
end

#offset_valueObject

Returns the value of attribute offset_value.



28
29
30
# File 'lib/active_model/relation.rb', line 28

def offset_value
  @offset_value
end

#order_clauseObject

Returns the value of attribute order_clause.



28
29
30
# File 'lib/active_model/relation.rb', line 28

def order_clause
  @order_clause
end

#where_clauseObject

Returns the value of attribute where_clause.



28
29
30
# File 'lib/active_model/relation.rb', line 28

def where_clause
  @where_clause
end

Instance Method Details

#allObject



110
111
112
# File 'lib/active_model/relation.rb', line 110

def all
  spawn
end

#except(*skips) ⇒ Object



142
143
144
# File 'lib/active_model/relation.rb', line 142

def except(*skips)
  relation_with(values.except(*skips))
end

#extendingObject



95
96
97
# File 'lib/active_model/relation.rb', line 95

def extending(...)
  spawn.extending!(...)
end

#extending!(*modules) ⇒ Object



99
100
101
102
103
104
105
106
107
108
# File 'lib/active_model/relation.rb', line 99

def extending!(*modules, &)
  modules << Module.new(&) if block_given?
  modules.flatten!

  self.extending_values += modules

  extend(*extending_values) if extending_values.any?

  self
end

#find(id = nil) ⇒ Object



42
43
44
45
46
47
48
49
# File 'lib/active_model/relation.rb', line 42

def find(id = nil, &)
  return records.find(id, &) if block_given?

  primary_key = model.try(:primary_key) || :id

  find_by(primary_key => id) ||
    raise(RecordNotFound.new("Couldn't find #{model} with '#{primary_key}'=#{id}", model, primary_key, id))
end

#find_by(attributes = {}) ⇒ Object



51
52
53
54
55
# File 'lib/active_model/relation.rb', line 51

def find_by(attributes = {})
  where_clause = self.where_clause + WhereClause.from_hash(attributes)

  records.find(&where_clause)
end

#inspectObject



135
136
137
138
139
140
# File 'lib/active_model/relation.rb', line 135

def inspect
  entries = records.take(11).map!(&:inspect)
  entries[10] = '...' if entries.size == 11

  "#<#{self.class.name} [#{entries.join(', ')}]>"
end

#limitObject



77
78
79
# File 'lib/active_model/relation.rb', line 77

def limit(...)
  spawn.limit!(...)
end

#limit!(limit) ⇒ Object



81
82
83
84
# File 'lib/active_model/relation.rb', line 81

def limit!(limit)
  self.limit_value = limit
  self
end

#offsetObject



68
69
70
# File 'lib/active_model/relation.rb', line 68

def offset(...)
  spawn.offset!(...)
end

#offset!(offset) ⇒ Object



72
73
74
75
# File 'lib/active_model/relation.rb', line 72

def offset!(offset)
  self.offset_value = offset
  self
end

#only(*keeps) ⇒ Object



146
147
148
# File 'lib/active_model/relation.rb', line 146

def only(*keeps)
  relation_with(values.slice(*keeps))
end

#orderObject



86
87
88
# File 'lib/active_model/relation.rb', line 86

def order(...)
  spawn.order!(...)
end

#order!(*values) ⇒ Object



90
91
92
93
# File 'lib/active_model/relation.rb', line 90

def order!(*values)
  self.order_clause += OrderClause.build(values)
  self
end

#recordsObject



119
120
121
122
123
124
125
# File 'lib/active_model/relation.rb', line 119

def records
  @records
    .select(&where_clause)
    .sort(&order_clause)
    .drop(offset_value || 0)
    .take(limit_value || @records.size)
end

#scopingObject



127
128
129
130
131
132
133
# File 'lib/active_model/relation.rb', line 127

def scoping
  previous_scope = model.current_scope
  model.current_scope = self
  yield
ensure
  model.current_scope = previous_scope
end

#to_aryObject Also known as: to_a



114
115
116
# File 'lib/active_model/relation.rb', line 114

def to_ary
  records.dup
end

#whereObject



57
58
59
# File 'lib/active_model/relation.rb', line 57

def where(...)
  spawn.where!(...)
end

#where!(attributes = {}) ⇒ Object



61
62
63
64
65
66
# File 'lib/active_model/relation.rb', line 61

def where!(attributes = {}, &)
  return WhereChain.new(spawn) unless attributes.any? || block_given?

  self.where_clause += WhereClause.build(attributes, &)
  self
end