From 557014d45aeed82ed1e79b83ab59697392a1a5de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sat, 24 Dec 2011 10:38:19 +0100 Subject: Tidy up migration types. --- .../lib/rails/generators/generated_attribute.rb | 76 ++++++++++++---------- 1 file changed, 43 insertions(+), 33 deletions(-) (limited to 'railties/lib/rails/generators/generated_attribute.rb') diff --git a/railties/lib/rails/generators/generated_attribute.rb b/railties/lib/rails/generators/generated_attribute.rb index 5ba37737a2..132145474b 100644 --- a/railties/lib/rails/generators/generated_attribute.rb +++ b/railties/lib/rails/generators/generated_attribute.rb @@ -1,13 +1,48 @@ require 'active_support/time' require 'active_support/core_ext/object/inclusion' +require 'active_support/core_ext/object/blank' module Rails module Generators class GeneratedAttribute - attr_accessor :name, :type, :has_index, :attr_options + attr_accessor :name, :type + attr_reader :attr_options - def initialize(column_definition) - parse column_definition + class << self + def parse(column_definition) + name, type, has_index = column_definition.split(':') + + # if user provided "name:index" instead of "name:string:index" + # type should be set blank so GeneratedAttribute's constructor + # could set it to :string + has_index, type = type, nil if %w(index uniq).include?(type) + + type, attr_options = *parse_type_and_options(type) + new(name, type, has_index, attr_options) + end + + private + + # parse possible attribute options like :limit for string/text/binary/integer or :precision/:scale for decimals + # when declaring options curly brackets should be used + def parse_type_and_options(type) + case type + when /(string|text|binary|integer){(\d+)}/ + return $1, :limit => $2.to_i + when /decimal{(\d+),(\d+)}/ + return :decimal, :precision => $1.to_i, :scale => $2.to_i + else + return type, {} + end + end + end + + def initialize(name, type=nil, index_type=false, attr_options={}) + @name = name + @type = (type.presence || :string).to_sym + @has_index = %w(index uniq).include?(index_type) + @has_uniq_index = %w(uniq).include?(index_type) + @attr_options = attr_options end def field_type @@ -44,10 +79,14 @@ module Rails name.to_s.humanize end + def index_name + reference? ? "#{name}_id" : name + end + def reference? self.type.in?([:references, :belongs_to]) end - + def has_index? @has_index end @@ -56,35 +95,6 @@ module Rails @has_uniq_index end - def parse(column_definition) - name, type, has_index = column_definition.split(':') - # if user provided "name:index" instead of "name:string:index" type should be set blank - # so GeneratedAttribute's constructor could set it to :string - if type =~ /index|uniq|unique/i - has_index = type - type = nil - end - type = :string if type.blank? - - @name = name - @type, @attr_options = *parse_type_and_options(type) - @has_index = ['index','uniq','unique'].include?(has_index) - @has_uniq_index = ['uniq','unique'].include?(has_index) - end - - # parse possible attribute options like :limit for string/text/binary/integer or :precision/:scale for decimals - # when declaring options curly brackets should be used - def parse_type_and_options(type) - attribute_options = case type - when /(string|text|binary|integer){(\d+)}/ - {:limit => $2.to_i} - when /decimal{(\d+),(\d+)}/ - {:precision => $1.to_i, :scale => $2.to_i} - else; {} - end - [type.to_s.gsub(/{.*}/,'').to_sym, attribute_options] - end - def inject_options @attr_options.blank? ? '' : ", #{@attr_options.to_s.gsub(/[{}]/, '')}" end -- cgit v1.2.3