class Mimi::DB::Dictate::SchemaDefinition

Attributes

columns[R]
indexes[R]
table_name[R]

Public Class Methods

new(table_name) click to toggle source
# File lib/mimi/db/dictate/schema_definition.rb, line 9
def initialize(table_name)
  @table_name = table_name
  @columns = {}
  @indexes = []
end

Public Instance Methods

field(name, opts) click to toggle source

Declares a field

Example:

field :s1, as: :string
field :s2, type: :string, size: 64
field :v1, as: :decimal, size: 10      # precision: 10
field :v2, as: :decimal, size: [10, 3] # precision: 10, scale: 3
# File lib/mimi/db/dictate/schema_definition.rb, line 24
def field(name, opts)
  name = name.to_sym
  raise "Cannot redefine field :#{name}" if @columns[name]
  opts_type = opts[:type] || opts[:as]
  if primary_key && (opts[:primary_key] || opts_type == :primary_key)
    raise "Cannot redefine primary key (:#{primary_key.name}) with :#{name}"
  end
  @columns[name] = Column.new(name, opts)
end
index(columns, opts) click to toggle source

Declares an index

Example:

index :name
index [:first_name, :last_name]
index :ref_code, unique: true

@param columns [String,Symbol,Array<String,Symbol>] columns to index on @param opts [Hash] index parameters (:unique, :name etc)

# File lib/mimi/db/dictate/schema_definition.rb, line 44
def index(columns, opts)
  case columns
  when String, Symbol
    columns = [columns.to_sym]
  when Array
    unless columns.all? { |c| c.is_a?(String) || c.is_a?(Symbol) }
      raise "Invalid column reference in index definition [#{columns}]"
    end
    columns = columns.map(&:to_sym)
  else
    raise 'Invalid columns argument to .index'
  end
  if columns == [primary_key.name]
    # TODO: warn the primary key index is ignored
  end
  @indexes << Index.new(columns, opts)
end
primary_key() click to toggle source

Returns primary key column

@return [Mimi::DB::Dictate::SchemaDefinition::Column]

# File lib/mimi/db/dictate/schema_definition.rb, line 66
def primary_key
  pk = columns.values.find { |c| c.params[:primary_key] }
  # raise "Primary key is not defined on '#{table_name}'" unless pk
  pk
end
to_h() click to toggle source
# File lib/mimi/db/dictate/schema_definition.rb, line 72
def to_h
  {
    table_name: table_name,
    columns: columns.values.map(&:to_h),
    indexes: indexes.map(&:to_h)
  }
end