aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails/generators/generated_attribute.rb
diff options
context:
space:
mode:
Diffstat (limited to 'railties/lib/rails/generators/generated_attribute.rb')
-rw-r--r--railties/lib/rails/generators/generated_attribute.rb76
1 files changed, 43 insertions, 33 deletions
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