Short form: How can I convince migrate to create or modify tables in a
database other than the “current” one? In other words, how can I get
migrate to honor establish_connection :external in a model definition?
Details: I have a large “almost static” dataset that never changes as a
result of my Rails app, so it’s residing in a separate database. (It
gets refreshed nightly with external data.) I’d like to maintain its
schema using the Rails migration mechanism, but despite my efforts,
migrate only updates tables for the current environment (e.g.
_development or _test).
Here’s a stripped down example:
=== MODELS (in app/models):
class Hat < ActiveRecord::Base
establish_connection :external # use external database
end
=== SCHEMA (in db/schema.rb, lightly edited):
ActiveRecord::Schema.define(:version => 20100812225348) do
create_table “hats”, :force => true do |t|
t.string “style”
end
end
=== TABLE DEFINITIONS (in config/database.yml, only showing first two
entries):
development:
adapter: mysql
encoding: utf8
reconnect: false
database: dbtest_development
pool: 5
username: root
password: XYZZY
socket: /tmp/mysql.sock
external:
adapter: mysql
encoding: utf8
reconnect: false
database: dbtest_external
pool: 5
username: root
password: XYZZY
socket: /tmp/mysql.sock
=== SYNOPSIS:
$ rails new dbtest
$ cd dbtest
$ <edit config/database.yml to add external table spec>
$ rake db:create:all
$ rails generate model Hat style:string
$ <edit models/hat.rb to include establish_connection as shown above>
$ rake db:migrate
At this point, I peeked at the db using mysql, and noticed that the
dbtest_development db had a table defined for ‘hats’, but
dbtest_external did not. Since Hat was defined to establish_connection
to dbtest_external, I was already in trouble. I tried adding an
explicit establish_connection for the migration process like this:
$ rake db:rollback
$ cat > db/migration/xxxx_create_hats.rb
class CreateHats < ActiveRecord::Migration
def self.up
Hat.establish_connection :external # added this line
create_table :hats do |t|
t.string :style
end
end
def self.down
Hat.establish_connection :external # added this line
drop_table :hats
end
end
^D
$ rake db:migrate
But after the rollback and migration, the dbtest_development db STILL
had a tables defined for ‘hats’ and dbtest_external had no ‘hats’ table.
I’ve pored over this forum, googled the web, and glanced at the sources,
but I still don’t see how to get migrate to manage tables in a database
other than the “current” one.
Ideas? Pointers?
Thanks as always…
- ff