Using Rails Migration on different database than standard production or development
A bit late, but I was dealing with this problem today and I came up with this custom rake task:
namespace :db do
desc "Apply db tasks in custom databases, for example rake db:alter[db:migrate,test-es] applies db:migrate on the database defined as test-es in databases.yml"
task :alter, [:task,:database] => [:environment] do |t, args|
require 'activerecord'
puts "Applying #{args.task} on #{args.database}"
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[args.database])
Rake::Task[args.task].invoke
end
end
Rails migrate with different databases
=================================UPDATE=================================
I find a nice article talking about it: http://www.thegreatcodeadventure.com/managing-multiple-databases-in-a-single-rails-application/
=================================UPDATE=================================
I just put establish_connection out of a migrate class.
ActiveRecord::Base.establish_connection "users_#{Rails.env}"
class AddDeviseToUsers < ActiveRecord::Migration
def self.up
change_table(:users) do |t|
## Database authenticatable
t.string :email, :null => false, :default => ""
t.string :encrypted_password, :null => false, :default => ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, :default => 0, :null => false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
## Confirmable
# t.string :confirmation_token
# t.datetime :confirmed_at
# t.datetime :confirmation_sent_at
# t.string :unconfirmed_email # Only if using reconfirmable
## Lockable
# t.integer :failed_attempts, :default => 0, :null => false # Only if lock strategy is :failed_attempts
# t.string :unlock_token # Only if unlock strategy is :email or :both
# t.datetime :locked_at
# Uncomment below if timestamps were not included in your original model.
# t.timestamps
end
add_index :users, :email, :unique => true
add_index :users, :reset_password_token, :unique => true
# add_index :users, :confirmation_token, :unique => true
# add_index :users, :unlock_token, :unique => true
end
def self.down
# By default, we don't want to make any assumption about how to roll back a migration when your
# model already existed. Please edit below which fields you would like to remove in this migration.
raise ActiveRecord::IrreversibleMigration
end
end
why schema.rb file differently between development and production environment?
Not sure why and how this could have happened, but I'd try to rollback the production db completely first, than just load up the schema and check
to rollback the production db:
rake db:rollback RAILS_ENV=production STEP=100
to load the schema:
rake db:schema:load RAILS_ENV=production
Can Rails app and rake db:migrate use different database credentials?
You could make a new environment configuration, similar to development
and production
, database_admin
, and use rake db:migrate RAILS_ENV=database_admin
.
If you get tired of typing the extra environment information all the time, you could use the clever rake tasks here to help reduce the tedium: http://errtheblog.com/posts/31-rake-around-the-rosie
Related Topics
Using Send_File to Download a File from Amazon S3
How to Deal With the Sum of Rounded Percentage Not Being 100
Iterate Through Every File in One Directory
How to Implement a Short Url Like the Urls in Twitter
What Are the Magic $-Prefixed Variables in Ruby
Ruby: Class Instance Variables VS Instance Variables
Fork Child Process with Timeout and Capture Output
Rails Catch-All/Globbing Routes
How to Turn a String into a Method Call
What Are Some Good Ruby-Based Web Crawlers
How to Create a Class Instance from a String Name in Ruby
How to Change the Default Path of View Files in a Rails 3 Controller
Read Binary File as String in Ruby
How to Run Untrusted Ruby Code Inside a Safe Sandbox
Can't Install Ruby on Rails with Rvm on Ubuntu 13.04
In Ruby on Rails, Are '#Encoding: Utf-8' and 'Config.Encoding = "Utf-8"' Different