Class: ActiveRecord::Result
- Inherits:
-
Object
- Object
- ActiveRecord::Result
- Includes:
- Enumerable
- Defined in:
- lib/active_record/result.rb
Overview
Active Record Result
This class encapsulates a result returned from calling #exec_query on any database connection adapter. For example:
result = ActiveRecord::Base.lease_connection.exec_query('SELECT id, title, body FROM posts')
result # => #<ActiveRecord::Result:0xdeadbeef>
# Get the column names of the result:
result.columns
# => ["id", "title", "body"]
# Get the record values of the result:
result.rows
# => [[1, "title_1", "body_1"],
[2, "title_2", "body_2"],
...
]
# Get an array of hashes representing the result (column => value):
result.to_a
# => [{"id" => 1, "title" => "title_1", "body" => "body_1"},
{"id" => 2, "title" => "title_2", "body" => "body_2"},
...
]
# ActiveRecord::Result also includes Enumerable.
result.each do |row|
puts row['title'] + " " + row['body']
end
Defined Under Namespace
Classes: IndexedRow
Instance Attribute Summary collapse
-
#column_types ⇒ Object
readonly
Returns the value of attribute column_types.
-
#columns ⇒ Object
readonly
Returns the value of attribute columns.
-
#rows ⇒ Object
readonly
Returns the value of attribute rows.
Class Method Summary collapse
-
.empty(async: false) ⇒ Object
:nodoc:.
Instance Method Summary collapse
- #[](idx) ⇒ Object
-
#cancel ⇒ Object
:nodoc:.
-
#cast_values(type_overrides = {}) ⇒ Object
:nodoc:.
-
#column_indexes ⇒ Object
:nodoc:.
-
#each(&block) ⇒ Object
Calls the given block once for each element in row collection, passing row as parameter.
-
#empty? ⇒ Boolean
Returns true if there are no records, otherwise false.
-
#freeze ⇒ Object
:nodoc:.
-
#includes_column?(name) ⇒ Boolean
Returns true if this result set includes the column named
name
. -
#indexed_rows ⇒ Object
:nodoc:.
-
#initialize(columns, rows, column_types = nil) ⇒ Result
constructor
A new instance of Result.
- #initialize_copy(other) ⇒ Object
-
#last(n = nil) ⇒ Object
Returns the last record from the rows collection.
-
#length ⇒ Object
Returns the number of elements in the rows array.
-
#result ⇒ Object
:nodoc:.
-
#to_ary ⇒ Object
(also: #to_a)
Returns an array of hashes representing each row record.
Constructor Details
#initialize(columns, rows, column_types = nil) ⇒ Result
Returns a new instance of Result.
102 103 104 105 106 107 108 109 110 |
# File 'lib/active_record/result.rb', line 102 def initialize(columns, rows, column_types = nil) # We freeze the strings to prevent them getting duped when # used as keys in ActiveRecord::Base's @attributes hash @columns = columns.each(&:-@).freeze @rows = rows @hash_rows = nil @column_types = column_types || EMPTY_HASH @column_indexes = nil end |
Instance Attribute Details
#column_types ⇒ Object (readonly)
Returns the value of attribute column_types.
92 93 94 |
# File 'lib/active_record/result.rb', line 92 def column_types @column_types end |
#columns ⇒ Object (readonly)
Returns the value of attribute columns.
92 93 94 |
# File 'lib/active_record/result.rb', line 92 def columns @columns end |
#rows ⇒ Object (readonly)
Returns the value of attribute rows.
92 93 94 |
# File 'lib/active_record/result.rb', line 92 def rows @rows end |
Class Method Details
.empty(async: false) ⇒ Object
:nodoc:
94 95 96 97 98 99 100 |
# File 'lib/active_record/result.rb', line 94 def self.empty(async: false) # :nodoc: if async EMPTY_ASYNC else EMPTY end end |
Instance Method Details
#[](idx) ⇒ Object
148 149 150 |
# File 'lib/active_record/result.rb', line 148 def [](idx) hash_rows[idx] end |
#cancel ⇒ Object
:nodoc:
161 162 163 |
# File 'lib/active_record/result.rb', line 161 def cancel # :nodoc: self end |
#cast_values(type_overrides = {}) ⇒ Object
:nodoc:
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
# File 'lib/active_record/result.rb', line 165 def cast_values(type_overrides = {}) # :nodoc: if columns.one? # Separated to avoid allocating an array per row type = if type_overrides.is_a?(Array) type_overrides.first else column_type(columns.first, 0, type_overrides) end rows.map do |(value)| type.deserialize(value) end else types = if type_overrides.is_a?(Array) type_overrides else columns.map.with_index { |name, i| column_type(name, i, type_overrides) } end rows.map do |values| Array.new(values.size) { |i| types[i].deserialize(values[i]) } end end end |
#column_indexes ⇒ Object
:nodoc:
203 204 205 206 207 208 209 210 211 212 213 214 |
# File 'lib/active_record/result.rb', line 203 def column_indexes # :nodoc: @column_indexes ||= begin index = 0 hash = {} length = columns.length while index < length hash[columns[index]] = index index += 1 end hash.freeze end end |
#each(&block) ⇒ Object
Calls the given block once for each element in row collection, passing row as parameter. Each row is a Hash-like, read only object.
To get real hashes, use .to_a.each
.
Returns an Enumerator
if no block is given.
128 129 130 131 132 133 134 |
# File 'lib/active_record/result.rb', line 128 def each(&block) if block_given? hash_rows.each(&block) else hash_rows.to_enum { @rows.size } end end |
#empty? ⇒ Boolean
Returns true if there are no records, otherwise false.
137 138 139 |
# File 'lib/active_record/result.rb', line 137 def empty? rows.empty? end |
#freeze ⇒ Object
:nodoc:
197 198 199 200 201 |
# File 'lib/active_record/result.rb', line 197 def freeze # :nodoc: hash_rows.freeze indexed_rows.freeze super end |
#includes_column?(name) ⇒ Boolean
Returns true if this result set includes the column named name
113 114 115 |
# File 'lib/active_record/result.rb', line 113 def includes_column?(name) @columns.include? name end |
#indexed_rows ⇒ Object
:nodoc:
216 217 218 219 220 221 |
# File 'lib/active_record/result.rb', line 216 def indexed_rows # :nodoc: @indexed_rows ||= begin columns = column_indexes @rows.map { |row| IndexedRow.new(columns, row) }.freeze end end |
#initialize_copy(other) ⇒ Object
191 192 193 194 195 |
# File 'lib/active_record/result.rb', line 191 def initialize_copy(other) @rows = rows.dup @column_types = column_types.dup @hash_rows = nil end |
#last(n = nil) ⇒ Object
Returns the last record from the rows collection.
153 154 155 |
# File 'lib/active_record/result.rb', line 153 def last(n = nil) n ? hash_rows.last(n) : hash_rows.last end |
#length ⇒ Object
Returns the number of elements in the rows array.
118 119 120 |
# File 'lib/active_record/result.rb', line 118 def length @rows.length end |
#result ⇒ Object
:nodoc:
157 158 159 |
# File 'lib/active_record/result.rb', line 157 def result # :nodoc: self end |
#to_ary ⇒ Object Also known as: to_a
Returns an array of hashes representing each row record.
142 143 144 |
# File 'lib/active_record/result.rb', line 142 def to_ary hash_rows end |