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/railtie.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, Railtie, WhereChain, WhereClause

Constant Summary collapse

VERSION =
'0.2.3'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of Relation.



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

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)



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

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.



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

def extending_values
  @extending_values
end

#limit_valueObject

Returns the value of attribute limit_value.



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

def limit_value
  @limit_value
end

#modelObject (readonly)

Returns the value of attribute model.



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

def model
  @model
end

#offset_valueObject

Returns the value of attribute offset_value.



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

def offset_value
  @offset_value
end

#order_clauseObject

Returns the value of attribute order_clause.



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

def order_clause
  @order_clause
end

#where_clauseObject

Returns the value of attribute where_clause.



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

def where_clause
  @where_clause
end

Instance Method Details

#allObject



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

def all
  spawn
end

#except(*skips) ⇒ Object



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

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

#extendingObject



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

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

#extending!(*modules) ⇒ Object



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

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



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

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



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

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

  records.find(&where_clause)
end

#inspectObject



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

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

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

#limitObject



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

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

#limit!(limit) ⇒ Object



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

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

#offsetObject



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

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

#offset!(offset) ⇒ Object



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

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

#only(*keeps) ⇒ Object



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

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

#orderObject



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

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

#order!(*values) ⇒ Object



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

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

#recordsObject



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

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

#scopingObject



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

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



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

def to_ary
  records.dup
end

#whereObject



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

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

#where!(attributes = {}) ⇒ Object



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

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

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