aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/CHANGELOG2
-rw-r--r--activerecord/lib/active_record/migration.rb23
-rw-r--r--activerecord/test/migration_test.rb15
-rw-r--r--railties/CHANGELOG7
-rwxr-xr-xrailties/fresh_rakefile4
5 files changed, 47 insertions, 4 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG
index 1c09b4e6dc..6eec1c03cf 100644
--- a/activerecord/CHANGELOG
+++ b/activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Added ActiveRecord::Migrator.migrate that can figure out whether to go up or down based on the target version and the current
+
* Added better error message for "packets out of order" #1630 [courtenay]
* Fixed first run of "rake migrate" on PostgreSQL by not expecting a return value on the id #1640
diff --git a/activerecord/lib/active_record/migration.rb b/activerecord/lib/active_record/migration.rb
index 365f57f366..a71e367ef2 100644
--- a/activerecord/lib/active_record/migration.rb
+++ b/activerecord/lib/active_record/migration.rb
@@ -108,6 +108,18 @@ module ActiveRecord
# add_column :items, :completed_items_count
# end
# end
+ #
+ # And some times you need to do something in SQL not abstracted directly by migrations:
+ #
+ # class MakeJoinUnique < ActiveRecord::Migration
+ # def self.up
+ # execute "ALTER TABLE `pages_linked_pages` ADD UNIQUE `page_id_linked_page_id` (`page_id`,`linked_page_id`)"
+ # end
+ #
+ # def self.down
+ # execute "ALTER TABLE `pages_linked_pages` DROP INDEX `page_id_linked_page_id`"
+ # end
+ # end
class Migration
class << self
def up() end
@@ -122,6 +134,17 @@ module ActiveRecord
class Migrator#:nodoc:
class << self
+ def migrate(migrations_path, target_version = nil)
+ case
+ when target_version.nil?, current_version < target_version
+ up(migrations_path, target_version)
+ when current_version > target_version
+ down(migrations_path, target_version)
+ when current_version == target_version
+ return # You're on the right version
+ end
+ end
+
def up(migrations_path, target_version = nil)
self.new(:up, migrations_path, target_version).migrate
end
diff --git a/activerecord/test/migration_test.rb b/activerecord/test/migration_test.rb
index 9e84978395..d5081e5335 100644
--- a/activerecord/test/migration_test.rb
+++ b/activerecord/test/migration_test.rb
@@ -182,5 +182,20 @@ if ActiveRecord::Base.connection.supports_migrations?
assert !Person.column_methods_hash.include?(:last_name)
assert_raises(ActiveRecord::StatementInvalid) { Reminder.column_methods_hash }
end
+
+ def test_migrator_going_down_due_to_version_target
+ ActiveRecord::Migrator.up(File.dirname(__FILE__) + '/fixtures/migrations/', 1)
+ ActiveRecord::Migrator.migrate(File.dirname(__FILE__) + '/fixtures/migrations/', 0)
+
+ assert !Person.column_methods_hash.include?(:last_name)
+ assert_raises(ActiveRecord::StatementInvalid) { Reminder.column_methods_hash }
+
+ ActiveRecord::Migrator.migrate(File.dirname(__FILE__) + '/fixtures/migrations/')
+
+ Person.reset_column_information
+ assert Person.column_methods_hash.include?(:last_name)
+ assert Reminder.create("content" => "hello world", "remind_at" => Time.now)
+ assert_equal "hello world", Reminder.find(:first).content
+ end
end
end \ No newline at end of file
diff --git a/railties/CHANGELOG b/railties/CHANGELOG
index 149c85e11d..35b4fc9ec3 100644
--- a/railties/CHANGELOG
+++ b/railties/CHANGELOG
@@ -1,8 +1,11 @@
*SVN*
-* Extend Ruby version check to include RUBY_RELEASE_DATE >= '2005-12-25', the final Ruby 1.8.2 release. #1674 [court3nay@gmail.com]
+* Added a VERSION parameter to the migrate task that allows you to do "rake migrate VERSION=34" to migrate to the 34th version traveling up or down depending on the current version
+
+* Extend Ruby version check to include RUBY_RELEASE_DATE >= '2005-12-25', the final Ruby 1.8.2 release #1674 [court3nay@gmail.com]
+
+* Improved documentation for environment config files #1625 [court3nay@gmail.com]
-* Improved documentation for environment config files. #1625 [court3nay@gmail.com]
*0.13.0*
diff --git a/railties/fresh_rakefile b/railties/fresh_rakefile
index 46bb73ef86..ac17c75546 100755
--- a/railties/fresh_rakefile
+++ b/railties/fresh_rakefile
@@ -187,7 +187,7 @@ task :clear_logs => :environment do
end
end
-desc "Migrate the database according to the migrate scripts in db/migrate"
+desc "Migrate the database according to the migrate scripts in db/migrate (only supported on PG/MySQL). A specific version can be targetted with VERSION=x"
task :migrate => :environment do
- ActiveRecord::Migrator.up(File.dirname(__FILE__) + '/db/migrate/')
+ ActiveRecord::Migrator.migrate(File.dirname(__FILE__) + '/db/migrate/', ENV["VERSION"])
end \ No newline at end of file