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