aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails/generators/generated_attribute.rb
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2011-12-24 10:40:01 +0100
committerJosé Valim <jose.valim@gmail.com>2011-12-24 10:40:06 +0100
commit0152fe977343dc348f9a33493652b3f923e12397 (patch)
tree9aac1ae030dfc9ad9e7cef22e5d05e35011e5af1 /railties/lib/rails/generators/generated_attribute.rb
parent7c42b9321a8c7e47304f62e9cec8ad2d9019decf (diff)
parentb4e97ea2d961c7ed99dcfa48044f4922378ff9cf (diff)
downloadrails-0152fe977343dc348f9a33493652b3f923e12397.tar.gz
rails-0152fe977343dc348f9a33493652b3f923e12397.tar.bz2
rails-0152fe977343dc348f9a33493652b3f923e12397.zip
Merge branch 'gzip-index' which contains two features:
1) Adding gzip to pages cache, closes #4124 2) Allow scaffold/model/migration generators to accept a "index" and "uniq" modifiers, as in: "tracking_id:integer:uniq" in order to generate (unique) indexes. Some types also accept custom options, for instance, you can specify the precision and scale for decimals as "price:decimal{7,2}". This feature closes #2555.
Diffstat (limited to 'railties/lib/rails/generators/generated_attribute.rb')
-rw-r--r--railties/lib/rails/generators/generated_attribute.rb60
1 files changed, 57 insertions, 3 deletions
diff --git a/railties/lib/rails/generators/generated_attribute.rb b/railties/lib/rails/generators/generated_attribute.rb
index 816d82cac3..132145474b 100644
--- a/railties/lib/rails/generators/generated_attribute.rb
+++ b/railties/lib/rails/generators/generated_attribute.rb
@@ -1,14 +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
+ attr_reader :attr_options
- def initialize(name, type)
- type = :string if type.blank?
- @name, @type = name, type.to_sym
+ 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
@@ -45,9 +79,29 @@ 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
+
+ def has_uniq_index?
+ @has_uniq_index
+ 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