Module: RelationToStruct::ActiveRecordRelationExtension

Extended by:
ActiveSupport::Concern
Defined in:
lib/relation_to_struct/active_record_relation_extension.rb

Instance Method Summary collapse

Instance Method Details

#to_structs(struct_class) ⇒ Object

Raises:

  • (ArgumentError)


4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/relation_to_struct/active_record_relation_extension.rb', line 4

def to_structs(struct_class)
  raise ArgumentError, 'Expected select_values to be present' unless self.select_values.present?

  relation = spawn
  result = klass.connection.select_all(relation.arel, nil, relation.arel.bind_values + bind_values)

  if result.columns.size != struct_class.members.size
    raise ArgumentError, 'Expected struct fields and columns lengths to be equal'
  end

  if result.columns.size != result.columns.uniq.size
    raise ArgumentError, 'Expected column names to be unique'
  end

  values_after_casting = ActiveRecord::VERSION::MAJOR >= 5 ? result.cast_values() : result.cast_values(klass.column_types)

  if result.columns.size == 1
    values_after_casting.map do |tuple|
      struct_class.new(tuple)
    end
  else
    values_after_casting.map do |tuple|
      struct_class.new(*tuple)
    end
  end
end