Class: ActiveModel::Relation
- Inherits:
-
Object
- Object
- ActiveModel::Relation
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
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_missing ⇒ Object
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_values ⇒ Object
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_value ⇒ Object
Returns the value of attribute limit_value.
28
29
30
|
# File 'lib/active_model/relation.rb', line 28
def limit_value
@limit_value
end
|
#model ⇒ Object
Returns the value of attribute model.
27
28
29
|
# File 'lib/active_model/relation.rb', line 27
def model
@model
end
|
#offset_value ⇒ Object
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_clause ⇒ Object
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_clause ⇒ Object
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
#all ⇒ Object
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
|
#extending ⇒ Object
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
|
#inspect ⇒ Object
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
|
#limit ⇒ Object
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
|
#offset ⇒ Object
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
|
#order ⇒ Object
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
|
#records ⇒ Object
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
|
#scoping ⇒ Object
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_ary ⇒ Object
Also known as:
to_a
114
115
116
|
# File 'lib/active_model/relation.rb', line 114
def to_ary
records.dup
end
|
#where ⇒ Object
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
|