module Mimi::DB::Dictate::DSL

Public Instance Methods

field(name, opts = {}) click to toggle source

Declares a field on a model

@example

field :id,   as: :integer, limit: 8, primary_key: true, default: 'random_uid()'

field :name # default type is :string
field :value, as: :decimal, precision: 10, scale: 3
field :ref_code, as: :string, default: -> { random_ref_code() } # application default
# File lib/mimi/db/dictate/dsl.rb, line 17
def field(name, opts = {})
  opts = opts.dup
  # alter model behaviour based on field properties
  if opts[:default].is_a?(Proc)
    field_setup_default(name, opts[:default])
    opts.delete(:default)
  end

  # register field in the schema
  schema_definition.field(name, opts)
end
index(columns, opts = {}) click to toggle source

Declares and index on one or several columns

@param columns [Symbol,Array<Symbol>] one or several columns @param opts [Hash] index options

@example

index :name
index [:customer_id, :account_id], unique: true, name: 'idx_txs_on_customer_account'
# File lib/mimi/db/dictate/dsl.rb, line 38
def index(columns, opts = {})
  schema_definition.index(columns, opts)
end
schema_definition() click to toggle source
# File lib/mimi/db/dictate/dsl.rb, line 42
def schema_definition
  unless self.respond_to?(:table_name)
    raise 'Mimi::DB::Dictate.schema_definition() expects .table_name, not invoked on a Model?'
  end
  Mimi::DB::Dictate.schema_definitions[table_name] ||=
    Mimi::DB::Dictate::SchemaDefinition.new(table_name)
end

Private Instance Methods

field_setup_default(name, block) click to toggle source

Sets up a default as a block/Proc

# File lib/mimi/db/dictate/dsl.rb, line 54
def field_setup_default(name, block)
  self.before_validation do
    send :"#{name}=", instance_exec(&block) unless send(name.to_sym)
  end
end