Sha256: 1fdab6e4121e0c42d995ba50977d58eebc0b631552718845e90270a09454044f

Contents?: true

Size: 998 Bytes

Versions: 1

Compression:

Stored size: 998 Bytes

Contents

module RelationToStruct::ActiveRecordRelationExtension
  extend ::ActiveSupport::Concern

  def to_structs(struct_class)
    raise '' 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.column_types.size
      raise ArgumentError, 'Expected unique column names count and column count to be equal'
    end

    result.cast_values(klass.column_types)

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

::ActiveRecord::Relation.send(:include, RelationToStruct::ActiveRecordRelationExtension)

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
relation_to_struct-0.0.5 lib/relation_to_struct/active_record_relation_extension.rb