Class: ActiveRecord::Result

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
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_hash
# => [{"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

Constructor Details

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

Returns a new instance of Result.



37
38
39
40
41
42
# File 'lib/active_record/result.rb', line 37

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.



35
36
37
# File 'lib/active_record/result.rb', line 35

def column_types
  @column_types
end

#columnsObject (readonly)

Returns the value of attribute columns.



35
36
37
# File 'lib/active_record/result.rb', line 35

def columns
  @columns
end

#rowsObject (readonly)

Returns the value of attribute rows.



35
36
37
# File 'lib/active_record/result.rb', line 35

def rows
  @rows
end

Instance Method Details

#[](idx) ⇒ Object



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

def [](idx)
  hash_rows[idx]
end

#cast_values(type_overrides = {}) ⇒ Object

:nodoc:



97
98
99
100
101
102
103
104
# File 'lib/active_record/result.rb', line 97

def cast_values(type_overrides = {}) # :nodoc:
  types = columns.map { |name| column_type(name, type_overrides) }
  result = rows.map do |values|
    types.zip(values).map { |type, value| type.deserialize(value) }
  end

  columns.one? ? result.map!(&:first) : result
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.



53
54
55
56
57
58
59
# File 'lib/active_record/result.rb', line 53

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)


70
71
72
# File 'lib/active_record/result.rb', line 70

def empty?
  rows.empty?
end

#firstObject

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



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

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

#initialize_copy(other) ⇒ Object



106
107
108
109
110
111
# File 'lib/active_record/result.rb', line 106

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.



92
93
94
95
# File 'lib/active_record/result.rb', line 92

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

#lengthObject

Returns the number of elements in the rows array.



45
46
47
# File 'lib/active_record/result.rb', line 45

def length
  @rows.length
end

#to_aryObject

Returns an array of hashes representing each row record.



75
76
77
# File 'lib/active_record/result.rb', line 75

def to_ary
  hash_rows
end

#to_hashObject

Returns an array of hashes representing each row record.



62
63
64
# File 'lib/active_record/result.rb', line 62

def to_hash
  hash_rows
end