class ROM::SQL::Postgres::Types::ArrayTypes

@api private

Attributes

base_read_type[R]
base_write_type[R]
constructor[R]
elements[R]

Public Class Methods

new(base_write_type, base_read_type) click to toggle source
# File lib/rom/sql/extensions/postgres/types/array_types.rb, line 19
def initialize(base_write_type, base_read_type)
  @elements = {}
  @base_write_type = base_write_type
  @base_read_type = base_read_type
  @constructor = proc { |db_type, member|
    if member
      -> arr { Sequel.pg_array(arr.map { |v| member[v] }, db_type) }
    else
      -> arr { Sequel.pg_array(arr, db_type) }
    end
  }
end

Public Instance Methods

[](db_type, member_type = nil) click to toggle source
# File lib/rom/sql/extensions/postgres/types/array_types.rb, line 32
def [](db_type, member_type = nil)
  elements.fetch(db_type) do
    name = "#{db_type}[]"

    write_type = build_write_type(db_type, member_type)
    read_type = build_read_type(db_type, member_type)

    array_type = Types.Type(name, write_type).meta(type: db_type, read: read_type)

    register_extension(array_type)

    elements[db_type] = array_type
  end
end

Private Instance Methods

build_read_type(_db_type, member_type) click to toggle source
# File lib/rom/sql/extensions/postgres/types/array_types.rb, line 57
def build_read_type(_db_type, member_type)
  if member_type && member_type.meta[:read]
    base_read_type.of(member_type.meta[:read])
  else
    base_read_type
  end
end
build_write_type(db_type, member_type) click to toggle source
# File lib/rom/sql/extensions/postgres/types/array_types.rb, line 49
def build_write_type(db_type, member_type)
  if member_type
    base_write_type.constructor(constructor[db_type, member_type])
  else
    base_write_type.constructor(constructor[db_type])
  end
end
register_extension(type) click to toggle source
# File lib/rom/sql/extensions/postgres/types/array_types.rb, line 65
def register_extension(type)
  TypeExtensions.register(type) { include ArrayMethods }
end