Class: ActiveRecord::Result

Inherits:
Object
  • Object
show all
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

Class Method Summary collapse

Instance Method Summary collapse

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_typesObject (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

#columnsObject (readonly)

Returns the value of attribute columns.



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

def columns
  @columns
end

#rowsObject (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

#cancelObject

: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_indexesObject

: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.

Returns:

  • (Boolean)


82
83
84
# File 'lib/active_record/result.rb', line 82

def empty?
  rows.empty?
end

#freezeObject

: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

Returns:

  • (Boolean)


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

#lengthObject

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

#resultObject

:nodoc:



102
103
104
# File 'lib/active_record/result.rb', line 102

def result # :nodoc:
  self
end

#to_aryObject 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