diff options
author | José Valim <jose.valim@gmail.com> | 2011-12-24 10:38:19 +0100 |
---|---|---|
committer | José Valim <jose.valim@gmail.com> | 2011-12-24 10:38:19 +0100 |
commit | b4e97ea2d961c7ed99dcfa48044f4922378ff9cf (patch) | |
tree | 9aac1ae030dfc9ad9e7cef22e5d05e35011e5af1 /railties | |
parent | 7a47f362c8246c20437f49111e5dcc0781d6d024 (diff) | |
download | rails-b4e97ea2d961c7ed99dcfa48044f4922378ff9cf.tar.gz rails-b4e97ea2d961c7ed99dcfa48044f4922378ff9cf.tar.bz2 rails-b4e97ea2d961c7ed99dcfa48044f4922378ff9cf.zip |
Tidy up migration types.
Diffstat (limited to 'railties')
9 files changed, 71 insertions, 50 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 diff --git a/railties/lib/rails/generators/named_base.rb b/railties/lib/rails/generators/named_base.rb index baf7cb7dca..9cef55e0a6 100644 --- a/railties/lib/rails/generators/named_base.rb +++ b/railties/lib/rails/generators/named_base.rb @@ -151,7 +151,7 @@ module Rails # Convert attributes array into GeneratedAttribute objects. def parse_attributes! #:nodoc: self.attributes = (attributes || []).map do |attr| - Rails::Generators::GeneratedAttribute.new(attr) + Rails::Generators::GeneratedAttribute.parse(attr) end end diff --git a/railties/lib/rails/generators/rails/migration/migration_generator.rb b/railties/lib/rails/generators/rails/migration/migration_generator.rb index ecf0a77b76..f87dce1502 100644 --- a/railties/lib/rails/generators/rails/migration/migration_generator.rb +++ b/railties/lib/rails/generators/rails/migration/migration_generator.rb @@ -1,7 +1,7 @@ module Rails module Generators class MigrationGenerator < NamedBase #metagenerator - argument :attributes, :type => :array, :default => [], :banner => "field:type field:type field:type:index" + argument :attributes, :type => :array, :default => [], :banner => "field[:type][:index] field[:type][:index]" hook_for :orm, :required => true end end diff --git a/railties/lib/rails/generators/rails/model/model_generator.rb b/railties/lib/rails/generators/rails/model/model_generator.rb index 2a882981c3..9bb29b784e 100644 --- a/railties/lib/rails/generators/rails/model/model_generator.rb +++ b/railties/lib/rails/generators/rails/model/model_generator.rb @@ -1,7 +1,7 @@ module Rails module Generators class ModelGenerator < NamedBase #metagenerator - argument :attributes, :type => :array, :default => [], :banner => "field:type field:type field:type:index" + argument :attributes, :type => :array, :default => [], :banner => "field[:type][:index] field[:type][:index]" hook_for :orm, :required => true end end diff --git a/railties/lib/rails/generators/rails/scaffold/USAGE b/railties/lib/rails/generators/rails/scaffold/USAGE index be1d113ed8..4a3eb2c7c7 100644 --- a/railties/lib/rails/generators/rails/scaffold/USAGE +++ b/railties/lib/rails/generators/rails/scaffold/USAGE @@ -7,23 +7,29 @@ Description: under_scored, as the first argument, and an optional list of attribute pairs. - Attribute pairs are field:type arguments specifying the - model's attributes. Timestamps are added by default, so you don't have to - specify them by hand as 'created_at:datetime updated_at:datetime'. + Attributes are field arguments specifying the model's attributes. You can + optionally pass the type and an index to each field. For instance: + "title body:text tracking_id:integer:uniq" will generate a title field of + string type, a body with text type and a tracking_id as an integer with an + unique index. "index" could also be given instead of "uniq" if one desires + a non unique index. + + Timestamps are added by default, so you don't have to specify them by hand + as 'created_at:datetime updated_at:datetime'. You don't have to think up every attribute up front, but it helps to sketch out a few so you can start working with the resource immediately. - For example, 'scaffold post title:string body:text published:boolean' - gives you a model with those three attributes, a controller that handles + For example, 'scaffold post title body:text published:boolean' gives + you a model with those three attributes, a controller that handles the create/show/update/destroy, forms to create and edit your posts, and - an index that lists them all, as well as a resources :posts - declaration in config/routes.rb. + an index that lists them all, as well as a resources :posts declaration + in config/routes.rb. If you want to remove all the generated files, run 'rails destroy scaffold ModelName'. Examples: `rails generate scaffold post` - `rails generate scaffold post title:string body:text published:boolean` - `rails generate scaffold purchase order_id:integer amount:decimal` + `rails generate scaffold post title body:text published:boolean` + `rails generate scaffold purchase amount:decimal tracking_id:integer:uniq` diff --git a/railties/lib/rails/generators/test_case.rb b/railties/lib/rails/generators/test_case.rb index ab55031d07..d81c4c3e1d 100644 --- a/railties/lib/rails/generators/test_case.rb +++ b/railties/lib/rails/generators/test_case.rb @@ -218,8 +218,8 @@ module Rails # # create_generated_attribute(:string, 'name') # - def create_generated_attribute(attribute_type, name = 'test') - Rails::Generators::GeneratedAttribute.new([name, attribute_type.to_s].join(':')) + def create_generated_attribute(attribute_type, name = 'test', index = nil) + Rails::Generators::GeneratedAttribute.parse([name, attribute_type, index].compact.join(':')) end protected diff --git a/railties/test/generators/generated_attribute_test.rb b/railties/test/generators/generated_attribute_test.rb index ea6c6e4e2c..6e3fc84781 100644 --- a/railties/test/generators/generated_attribute_test.rb +++ b/railties/test/generators/generated_attribute_test.rb @@ -69,7 +69,7 @@ class GeneratedAttributeTest < Rails::Generators::TestCase end def test_default_value_for_type - att = Rails::Generators::GeneratedAttribute.new("type:string") + att = Rails::Generators::GeneratedAttribute.parse("type:string") assert_equal("", att.default) end @@ -122,4 +122,9 @@ class GeneratedAttributeTest < Rails::Generators::TestCase assert_equal :string, create_generated_attribute(nil, 'title').type assert_equal :string, create_generated_attribute("", 'title').type end + + def test_handles_index_names_for_references + assert_equal "post", create_generated_attribute('string', 'post').index_name + assert_equal "post_id", create_generated_attribute('references', 'post').index_name + end end diff --git a/railties/test/generators/migration_generator_test.rb b/railties/test/generators/migration_generator_test.rb index 6b6c9dee7c..9da1b53c96 100644 --- a/railties/test/generators/migration_generator_test.rb +++ b/railties/test/generators/migration_generator_test.rb @@ -60,7 +60,7 @@ class MigrationGeneratorTest < Rails::Generators::TestCase def test_add_migration_with_attributes_and_indices migration = "add_title_with_index_and_body_to_posts" - run_generator [migration, "title:string:index", "body:text", "user_id:integer:unique"] + run_generator [migration, "title:string:index", "body:text", "user_id:integer:uniq"] assert_migration "db/migrate/#{migration}.rb" do |content| assert_method :change, content do |up| diff --git a/railties/test/generators/model_generator_test.rb b/railties/test/generators/model_generator_test.rb index 7a8cf1d8a7..c063d4d687 100644 --- a/railties/test/generators/model_generator_test.rb +++ b/railties/test/generators/model_generator_test.rb @@ -114,7 +114,7 @@ class ModelGeneratorTest < Rails::Generators::TestCase end def test_migration_with_attributes_and_with_index - run_generator ["product", "name:string:index", "supplier_id:integer:index", "user_id:integer:uniq", "order_id:unique"] + run_generator ["product", "name:string:index", "supplier_id:integer:index", "user_id:integer:uniq", "order_id:uniq"] assert_migration "db/migrate/create_products.rb" do |m| assert_method :change, m do |up| |