At ShowNearby we have been doing a very big migration to RoR 3.1 from PHP and we are facing several problems that may be some of you have solved before.
We have big amounts of data and we decided to segregate our DB into several DBs that we can handle separately. For example, our accounts, places, logs and others are split into several databases
We need to get migrations, fixtures, models, to play nicely, and so far it has been quite messy. Some of our requirements for a solution to be acceptable:
- one model should relate to one tables in one of the databases.
- rake db:drop - should drop all the database env we specify in database.yml
- rake db:create - should create all the database env we specify in database.yml
- rake db:migrate - should run migrations to the various databases
- rake db:test - should grab fixtures and drop them into the various databases and test unit/function/etc
We are considering setting separate rails projects per each database and connecting them with ActiveResource, but we feel this is not very efficient. Have any of you deal with a similar problem before?
Thanks so much!!
Hey this post is old but I've found a solution working on Rails 3.2 that might help someone else. https://stackoverflow.com/a/16542724/1447654
Connecting to different databases is quite easy:
I would be wary of setting up multiple Rails projects as you will add a lot of overhead to data retrieval for your controllers, which could make things slow.
As for your questions about migrations, fixtures, models etc.: I don't think there will be an easy way, so please post separate questions and be as specific as you can.
Consolidating the DBs into one is not an option? It would make your life a lot easier!
The following article suggests defining new Rake tasks to achieve migrations against multiple databases. Each task sets up its own connection and then executes the migration with this connection and the specific database folder.
It also defines a familiar
db:migrate
that calls the two other tasks.Including here incase the link becomes unavailable:
Source: Ruby on Rails Connect to Multiple Databases and Migrations
To Wukerplank's answer, you can also put the connection details in database.yml like usual with a name like so:
Then in your special model:
To keep those pesky credentials from being in your application code.
Edit: If you want to reuse this connection in multiple models, you should create a new abstract class and inherit from it, because connections are tightly coupled to classes (as explained here, here, and here), and new connections will be created for each class.
If that is the case, set things up like so:
Found a great post that will point others to the right way of doing this check out http://blog.bitmelt.com/2008/10/connecting-to-multiple-database-in-ruby.html
Set it up something like this:
database.yml (db config file)
support_base.rb (a model file)
tst_test.rb (a model file)
PS, this really doesn't cover migrations, I don't think you can do migrations on more than one DB with rake (although I'm not sure that is a hard 'cannot do', it may be possible). This was just a great way to connect and query other DBs that you don't control.
You might also want to append the Rails environment, so your development and test databases are not the same.