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.



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

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.



34
35
36
# File 'lib/app_query.rb', line 34

def cast
  @cast
end

Class Method Details

.from_ar_result(r, cast = nil) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/app_query.rb', line 53

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.map { [_1] } if r.columns.one?
      new(r.columns, rows, overrides, cast: true)
    end
  end
end

Instance Method Details

#column(name = nil) ⇒ Object



44
45
46
47
48
49
50
51
# File 'lib/app_query.rb', line 44

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