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
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
. -
#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.
49 50 51 52 53 54 55 56 57 |
# File 'lib/active_record/result.rb', line 49 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.
39 40 41 |
# File 'lib/active_record/result.rb', line 39 def column_types @column_types end |
#columns ⇒ Object (readonly)
Returns the value of attribute columns.
39 40 41 |
# File 'lib/active_record/result.rb', line 39 def columns @columns end |
#rows ⇒ Object (readonly)
Returns the value of attribute rows.
39 40 41 |
# File 'lib/active_record/result.rb', line 39 def rows @rows end |
Class Method Details
.empty(async: false) ⇒ Object
:nodoc:
41 42 43 44 45 46 47 |
# File 'lib/active_record/result.rb', line 41 def self.empty(async: false) # :nodoc: if async EMPTY_ASYNC else EMPTY end end |
Instance Method Details
#[](idx) ⇒ Object
93 94 95 |
# File 'lib/active_record/result.rb', line 93 def [](idx) hash_rows[idx] end |
#cancel ⇒ Object
:nodoc:
106 107 108 |
# File 'lib/active_record/result.rb', line 106 def cancel # :nodoc: self end |
#cast_values(type_overrides = {}) ⇒ Object
:nodoc:
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/active_record/result.rb', line 110 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:
148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/active_record/result.rb', line 148 def column_indexes # :nodoc: @column_indexes ||= begin index = 0 hash = {} length = columns.length while index < length hash[columns[index]] = index index += 1 end hash end end |
#each(&block) ⇒ Object
Calls the given block once for each element in row collection, passing row as parameter.
Returns an Enumerator
if no block is given.
73 74 75 76 77 78 79 |
# File 'lib/active_record/result.rb', line 73 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.
82 83 84 |
# File 'lib/active_record/result.rb', line 82 def empty? rows.empty? end |
#freeze ⇒ Object
:nodoc:
143 144 145 146 |
# File 'lib/active_record/result.rb', line 143 def freeze # :nodoc: hash_rows.freeze super end |
#includes_column?(name) ⇒ Boolean
Returns true if this result set includes the column named name
60 61 62 |
# File 'lib/active_record/result.rb', line 60 def includes_column?(name) @columns.include? name end |
#initialize_copy(other) ⇒ Object
136 137 138 139 140 141 |
# File 'lib/active_record/result.rb', line 136 def initialize_copy(other) @columns = columns @rows = rows.dup @column_types = column_types.dup @hash_rows = nil end |
#last(n = nil) ⇒ Object
Returns the last record from the rows collection.
98 99 100 |
# File 'lib/active_record/result.rb', line 98 def last(n = nil) n ? hash_rows.last(n) : hash_rows.last end |
#length ⇒ Object
Returns the number of elements in the rows array.
65 66 67 |
# File 'lib/active_record/result.rb', line 65 def length @rows.length end |
#result ⇒ Object
:nodoc:
102 103 104 |
# File 'lib/active_record/result.rb', line 102 def result # :nodoc: self end |
#to_ary ⇒ Object Also known as: to_a
Returns an array of hashes representing each row record.
87 88 89 |
# File 'lib/active_record/result.rb', line 87 def to_ary hash_rows end |