class HoboFields::Model::IndexSpec

Attributes

fields[RW]
name[RW]
table[RW]
unique[RW]
where[RW]

Public Class Methods

for_model(model, old_table_name=nil) click to toggle source

extract IndexSpecs from an existing table

# File lib/hobo_fields/model/index_spec.rb, line 21
def self.for_model(model, old_table_name=nil)
  t = old_table_name || model.table_name
  model.connection.indexes(t).map do |i|
    self.new(model, i.columns, :name => i.name, :unique => i.unique, :where => i.where, :table_name => old_table_name) unless model.ignore_indexes.include?(i.name)
  end.compact
end
new(model, fields, options={}) click to toggle source
# File lib/hobo_fields/model/index_spec.rb, line 6
def initialize(model, fields, options={})
  @model = model
  self.table = options.delete(:table_name) || model.table_name
  self.fields = Array.wrap(fields).*.to_s
  self.name = options.delete(:name) || model.connection.index_name(self.table, :column => self.fields)
  self.unique = options.delete(:unique) || false
  if options[:where]
    self.where = "#{options.delete(:where)}"
    self.where = "(#{self.where})" unless self.where.start_with?('(')
  end
end

Public Instance Methods

==(v) click to toggle source
# File lib/hobo_fields/model/index_spec.rb, line 54
def ==(v)
  v.hash == hash
end
Also aliased as: eql?
default_name?() click to toggle source
# File lib/hobo_fields/model/index_spec.rb, line 28
def default_name?
  name == @model.connection.index_name(table, :column => fields)
end
eql?(v) click to toggle source
Alias for: ==
hash() click to toggle source
# File lib/hobo_fields/model/index_spec.rb, line 50
def hash
  [table, fields, name, unique, where].hash
end
to_add_statement(new_table_name) click to toggle source
# File lib/hobo_fields/model/index_spec.rb, line 32
def to_add_statement(new_table_name)
  r = "add_index :#{new_table_name}, #{fields.*.to_sym.inspect}"
  r += ", :unique => true" if unique
  r += ", :where => '#{self.where}'" if self.where.present?
  if default_name?
    check_name = @model.connection.index_name(self.table, :column => self.fields)
  else
    check_name = name
  end
  if check_name.length > @model.connection.index_name_length
    r += ", :name => '#{name[0,@model.connection.index_name_length]}'"
    $stderr.puts("WARNING: index name #{check_name} too long, trimming")
  else
    r += ", :name => '#{name}'" unless default_name?
  end
  r
end