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, unique: false) ⇒ 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.
143 144 145 146 147 148 |
# File 'lib/app_query.rb', line 143 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.
140 141 142 |
# File 'lib/app_query.rb', line 140 def cast @cast end |
Class Method Details
.from_ar_result(r, cast = nil) ⇒ Object
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
# File 'lib/app_query.rb', line 205 def self.from_ar_result(r, cast = nil) if r.empty? r.columns.empty? ? EMPTY : new(r.columns, [], r.column_types) 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.
196 197 198 199 200 201 202 203 |
# File 'lib/app_query.rb', line 196 def self.resolve_cast_type(value) case value when Symbol ActiveRecord::Type.lookup(value) else value end end |
Instance Method Details
#column(name = nil, unique: false) ⇒ Object
150 151 152 153 154 155 156 157 |
# File 'lib/app_query.rb', line 150 def column(name = nil, unique: false) 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] }.then { unique ? _1.uniq! : _1 } end |
#size ⇒ Object
159 160 161 |
# File 'lib/app_query.rb', line 159 def size count end |
#transform! {|Hash| ... } ⇒ self
Transforms each record in-place using the provided block.
183 184 185 186 |
# File 'lib/app_query.rb', line 183 def transform! @hash_rows = hash_rows.map { |r| yield(r) } unless empty? self end |