class HoboFields::Model::FieldSpec

Constants

MYSQL_COLUMN_CLASS
SQLITE_COLUMN_CLASS
TYPE_SYNONYMS

Attributes

model[RW]
name[RW]
options[RW]
position[RW]
type[RW]

Public Class Methods

new(model, name, type, options={}) click to toggle source
# File lib/hobo_fields/model/field_spec.rb, line 8
def initialize(model, name, type, options={})
  raise ArgumentError, "you cannot provide a field spec for the primary key" if name == model.primary_key
  self.model = model
  self.name = name.to_sym
  self.type = type.is_a?(String) ? type.to_sym : type
  position = options.delete(:position)
  self.options = options
  self.position = position || model.field_specs.length
end

Public Instance Methods

comment() click to toggle source
# File lib/hobo_fields/model/field_spec.rb, line 65
def comment
  options[:comment]
end
default() click to toggle source
# File lib/hobo_fields/model/field_spec.rb, line 61
def default
  options[:default]
end
different_to?(col_spec) click to toggle source
# File lib/hobo_fields/model/field_spec.rb, line 80
def different_to?(col_spec)
  !same_type?(col_spec) ||
    # we should be able to use col_spec.comment, but col_spec has
    # a nil table_name for some strange reason.
    begin
      if model.table_exists?
        col_comment = ActiveRecord::Base.try.column_comment(col_spec.name, model.table_name)
        col_comment != nil && col_comment != comment
      else
        false
      end
    end ||
    begin
      check_attributes = [:null, :default]
      check_attributes += [:precision, :scale] if sql_type == :decimal && !col_spec.is_a?(SQLITE_COLUMN_CLASS)  # remove when rails fixes https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2872
      check_attributes -= [:default] if sql_type == :text && col_spec.is_a?(MYSQL_COLUMN_CLASS)
      check_attributes << :limit if sql_type.in?([:string, :text, :binary, :integer])
      check_attributes.any? do |k|
        if k==:default && sql_type==:datetime
          col_spec.default.try.to_datetime != default.try.to_datetime
        else
          col_spec.send(k) != self.send(k)
        end
      end
    end
end
limit() click to toggle source
# File lib/hobo_fields/model/field_spec.rb, line 45
def limit
  options[:limit] || native_types[sql_type][:limit]
end
null() click to toggle source
# File lib/hobo_fields/model/field_spec.rb, line 57
def null
  :null.in?(options) ? options[:null] : true
end
precision() click to toggle source
# File lib/hobo_fields/model/field_spec.rb, line 49
def precision
  options[:precision]
end
same_type?(col_spec) click to toggle source
# File lib/hobo_fields/model/field_spec.rb, line 69
def same_type?(col_spec)
  t = sql_type
  TYPE_SYNONYMS.each do |synonyms|
    if t.in? synonyms
      return col_spec.type.in?(synonyms)
    end
  end
  t == col_spec.type
end
scale() click to toggle source
# File lib/hobo_fields/model/field_spec.rb, line 53
def scale
  options[:scale]
end
sql_type() click to toggle source
# File lib/hobo_fields/model/field_spec.rb, line 34
def sql_type
  options[:sql_type] or begin
                          if native_type?(type)
                            type
                          else
                            field_class = HoboFields.to_class(type)
                            field_class && field_class::COLUMN_TYPE or raise UnknownSqlTypeError, "#{type.inspect} for #{model}.#{name}"
                          end
                        end
end