Class: AppQuery::Result

Inherits:
ActiveRecord::Result
  • Object
show all
Defined in:
lib/app_query.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(columns, rows, overrides = nil, cast: false) ⇒ Result

Returns a new instance of Result.



120
121
122
123
124
125
# File 'lib/app_query.rb', line 120

def initialize(columns, rows, overrides = nil, cast: false)
  super(columns, rows, overrides)
  @cast = cast
  # Rails v6.1: prevent mutate on frozen object on #first
  @hash_rows = [] if columns.empty?
end

Instance Attribute Details

#castObject Also known as: cast?

Returns the value of attribute cast.



117
118
119
# File 'lib/app_query.rb', line 117

def cast
  @cast
end

Class Method Details

.from_ar_result(r, cast = nil) ⇒ Object



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/app_query.rb', line 140

def self.from_ar_result(r, cast = nil)
  if r.empty?
    EMPTY
  else
    cast &&= case cast
    when Array
      r.columns.zip(cast).to_h
    when Hash
      cast
    else
      {}
    end
    if !cast || (cast.empty? && r.column_types.empty?)
      # nothing to cast
      new(r.columns, r.rows, r.column_types)
    else
      overrides = (r.column_types || {}).merge(cast)
      rows = r.cast_values(overrides)
      # One column is special :( ;(
      # > ActiveRecord::Base.connection.select_all("select array[1,2]").rows
      # => [["{1,2}"]]
      # > ActiveRecord::Base.connection.select_all("select array[1,2]").cast_values
      # => [[1, 2]]
      rows = rows.zip if r.columns.one?
      new(r.columns, rows, overrides, cast: true)
    end
  end
end

Instance Method Details

#column(name = nil) ⇒ Object



127
128
129
130
131
132
133
134
# File 'lib/app_query.rb', line 127

def column(name = nil)
  return [] if empty?
  unless name.nil? || includes_column?(name)
    raise ArgumentError, "Unknown column #{name.inspect}. Should be one of #{columns.inspect}."
  end
  ix = name.nil? ? 0 : columns.index(name)
  rows.map { _1[ix] }
end

#sizeObject



136
137
138
# File 'lib/app_query.rb', line 136

def size
  count
end