Module: ROM::SQL::Attribute::TypeExtensions

Defined in:
lib/rom/sql/attribute.rb

Overview

Type-specific methods

Class Method Summary collapse

Class Method Details

.[](wrapped) ⇒ Hash

Gets extensions for a type

Parameters:

  • type (Dry::Types::Type)

Returns:

  • (Hash)


31
32
33
34
35
# File 'lib/rom/sql/attribute.rb', line 31

def [](wrapped)
  type = wrapped.default? ? wrapped.type : wrapped
  type = type.optional? ? type.right : type
  @types[type.meta[:database]][type.meta[:db_type]] || EMPTY_HASH
end

.register(type, &block) ⇒ Object

Registers a set of operations supported for a specific type

Examples:

ROM::SQL::Attribute::TypeExtensions.register(ROM::SQL::Types::PG::JSONB) do
  def contain(type, expr, keys)
    Attribute[Types::Bool].meta(sql_expr: expr.pg_jsonb.contains(value))
  end
end

Parameters:

  • type (Dry::Types::Type)

    Type

Raises:

  • (ArgumentError)


49
50
51
52
53
54
55
56
57
58
# File 'lib/rom/sql/attribute.rb', line 49

def register(type, &block)
  extensions = @types[type.meta[:database]]
  db_type = type.meta[:db_type]

  raise ArgumentError, "Type #{ type } already registered" if @types.key?(type)
  mod = Module.new(&block)
  ctx = Object.new.extend(mod)
  functions = mod.public_instance_methods.each_with_object({}) { |m, ms| ms[m] = ctx.method(m) }
  extensions[db_type] = functions
end