Class: ActiveRecord::Result

Inherits:
Object show all
Includes:
Enumerable
Defined in:
activerecord/lib/active_record/result.rb

Overview

This class encapsulates a result returned from calling #exec_query on any database connection adapter. For example:

result = ActiveRecord::Base.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

Instance Method Summary collapse

Methods included from Enumerable

#as_json, #compact_blank, #exclude?, #excluding, #including, #index_by, #index_with, #many?, #pick, #pluck, #sum, #without

Constructor Details

#initialize(columns, rows, column_types = {}) ⇒ Result

Returns a new instance of Result.


39
40
41
42
43
44
# File 'activerecord/lib/active_record/result.rb', line 39

def initialize(columns, rows, column_types = {})
  @columns      = columns
  @rows         = rows
  @hash_rows    = nil
  @column_types = column_types
end

Instance Attribute Details

#column_typesObject (readonly)

Returns the value of attribute column_types


37
38
39
# File 'activerecord/lib/active_record/result.rb', line 37

def column_types
  @column_types
end

#columnsObject (readonly)

Returns the value of attribute columns


37
38
39
# File 'activerecord/lib/active_record/result.rb', line 37

def columns
  @columns
end

#rowsObject (readonly)

Returns the value of attribute rows


37
38
39
# File 'activerecord/lib/active_record/result.rb', line 37

def rows
  @rows
end

Instance Method Details

#[](idx) ⇒ Object


91
92
93
# File 'activerecord/lib/active_record/result.rb', line 91

def [](idx)
  hash_rows[idx]
end

#cast_values(type_overrides = {}) ⇒ Object

:nodoc:


109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'activerecord/lib/active_record/result.rb', line 109

def cast_values(type_overrides = {}) # :nodoc:
  if columns.one?
    # Separated to avoid allocating an array per row

    type = column_type(columns.first, type_overrides)

    rows.map do |(value)|
      type.deserialize(value)
    end
  else
    types = columns.map { |name| column_type(name, type_overrides) }

    rows.map do |values|
      Array.new(values.size) { |i| types[i].deserialize(values[i]) }
    end
  end
end

#eachObject

Calls the given block once for each element in row collection, passing row as parameter.

Returns an Enumerator if no block is given.


60
61
62
63
64
65
66
# File 'activerecord/lib/active_record/result.rb', line 60

def each
  if block_given?
    hash_rows.each { |row| yield row }
  else
    hash_rows.to_enum { @rows.size }
  end
end

#empty?Boolean

Returns true if there are no records, otherwise false.

Returns:

  • (Boolean)

80
81
82
# File 'activerecord/lib/active_record/result.rb', line 80

def empty?
  rows.empty?
end

#firstObject

Returns the first record from the rows collection. If the rows collection is empty, returns nil.


97
98
99
100
# File 'activerecord/lib/active_record/result.rb', line 97

def first
  return nil if @rows.empty?
  Hash[@columns.zip(@rows.first)]
end

#includes_column?(name) ⇒ Boolean

Returns true if this result set includes the column named name

Returns:

  • (Boolean)

47
48
49
# File 'activerecord/lib/active_record/result.rb', line 47

def includes_column?(name)
  @columns.include? name
end

#initialize_copy(other) ⇒ Object


127
128
129
130
131
132
# File 'activerecord/lib/active_record/result.rb', line 127

def initialize_copy(other)
  @columns      = columns.dup
  @rows         = rows.dup
  @column_types = column_types.dup
  @hash_rows    = nil
end

#lastObject

Returns the last record from the rows collection. If the rows collection is empty, returns nil.


104
105
106
107
# File 'activerecord/lib/active_record/result.rb', line 104

def last
  return nil if @rows.empty?
  Hash[@columns.zip(@rows.last)]
end

#lengthObject

Returns the number of elements in the rows array.


52
53
54
# File 'activerecord/lib/active_record/result.rb', line 52

def length
  @rows.length
end

#to_aryObject Also known as: to_a

Returns an array of hashes representing each row record.


85
86
87
# File 'activerecord/lib/active_record/result.rb', line 85

def to_ary
  hash_rows
end

#to_hashObject


68
69
70
71
72
73
74
# File 'activerecord/lib/active_record/result.rb', line 68

def to_hash
  ActiveSupport::Deprecation.warn(<<-MSG.squish)
    `ActiveRecord::Result#to_hash` has been renamed to `to_a`.
    `to_hash` is deprecated and will be removed in Rails 6.1.
  MSG
  to_a
end