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.rb52
1 files changed, 48 insertions, 4 deletions
diff --git a/railties/lib/rails/generators/generated_attribute.rb b/railties/lib/rails/generators/generated_attribute.rb
index 816d82cac3..5ba37737a2 100644
--- a/railties/lib/rails/generators/generated_attribute.rb
+++ b/railties/lib/rails/generators/generated_attribute.rb
@@ -4,11 +4,10 @@ require 'active_support/core_ext/object/inclusion'
module Rails
module Generators
class GeneratedAttribute
- attr_accessor :name, :type
+ attr_accessor :name, :type, :has_index, :attr_options
- def initialize(name, type)
- type = :string if type.blank?
- @name, @type = name, type.to_sym
+ def initialize(column_definition)
+ parse column_definition
end
def field_type
@@ -48,6 +47,51 @@ module Rails
def reference?
self.type.in?([:references, :belongs_to])
end
+
+ def has_index?
+ @has_index
+ end
+
+ def has_uniq_index?
+ @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
+
+ def inject_index_options
+ has_uniq_index? ? ", :unique => true" : ''
+ end
end
end
end