Class: AppQuery::Result
- Inherits:
-
ActiveRecord::Result
- Object
- ActiveRecord::Result
- AppQuery::Result
- Defined in:
- lib/app_query.rb
Instance Attribute Summary collapse
-
#cast ⇒ Object
(also: #cast?)
Returns the value of attribute cast.
Class Method Summary collapse
- .from_ar_result(r, cast = nil) ⇒ Object
-
.resolve_cast_type(value) ⇒ Object
Resolves a cast type value, converting symbols to ActiveRecord types.
Instance Method Summary collapse
- #column(name = nil) ⇒ Object
-
#initialize(columns, rows, overrides = nil, cast: false) ⇒ Result
constructor
A new instance of Result.
- #size ⇒ Object
-
#transform! {|Hash| ... } ⇒ self
Transforms each record in-place using the provided block.
Constructor Details
#initialize(columns, rows, overrides = nil, cast: false) ⇒ Result
Returns a new instance of Result.
123 124 125 126 127 128 |
# File 'lib/app_query.rb', line 123 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
#cast ⇒ Object Also known as: cast?
Returns the value of attribute cast.
120 121 122 |
# File 'lib/app_query.rb', line 120 def cast @cast end |
Class Method Details
.from_ar_result(r, cast = nil) ⇒ Object
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
# File 'lib/app_query.rb', line 185 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.transform_keys(&:to_s).transform_values { |v| resolve_cast_type(v) } 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 |
.resolve_cast_type(value) ⇒ Object
Resolves a cast type value, converting symbols to ActiveRecord types.
176 177 178 179 180 181 182 183 |
# File 'lib/app_query.rb', line 176 def self.resolve_cast_type(value) case value when Symbol ActiveRecord::Type.lookup(value) else value end end |
Instance Method Details
#column(name = nil) ⇒ Object
130 131 132 133 134 135 136 137 |
# File 'lib/app_query.rb', line 130 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 |
#size ⇒ Object
139 140 141 |
# File 'lib/app_query.rb', line 139 def size count end |
#transform! {|Hash| ... } ⇒ self
Transforms each record in-place using the provided block.
163 164 165 166 |
# File 'lib/app_query.rb', line 163 def transform! @hash_rows = hash_rows.map { |r| yield(r) } unless empty? self end |