Multiverse
🔥 Multiple databases for Rails
One of the easiest ways to scale your database is to move large, infrequently-joined tables to a separate database. ActiveRecord supports multiple databases, but Rails doesn’t provide a way to manage them. Multiverse changes this.
Works with Rails 4.2+
Installation
Add this line to your application’s Gemfile:
gem 'multiverse'
Getting Started
In this example, we’ll have a separate database for our e-commerce catalog that we’ll call catalog
.
The first step is to generate the necessary files.
rails generate multiverse:db catalog
This creates a CatalogRecord
class for models to inherit from and adds configuration to config/database.yml
. It also creates a db/catalog
directory for migrations and schema.rb
to live.
rails
and rake
commands run for the original database by default. To run commands for the new database, use the DB
environment variable. For instance:
Create the database
DB=catalog rails db:create
Create a migration
DB=catalog rails generate migration add_name_to_products
Run migrations
DB=catalog rails db:migrate
Rollback
DB=catalog rails db:rollback
Models
Also works for models
DB=catalog rails generate model Product
This generates
class Product < CatalogRecord
end
Web Servers
For web servers that fork, be sure to reconnect after forking (just like you do with ActiveRecord::Base
)
Puma
In config/puma.rb
, add inside the on_worker_boot
block
CatalogRecord.establish_connection :"catalog_#{Rails.env}"
Unicorn
In config/unicorn.rb
, add inside the before_fork
block
CatalogRecord.connection.disconnect!
And inside the after_fork
block
CatalogRecord.establish_connection :"catalog_#{Rails.env}"
Testing
Fixtures
Rails fixtures work automatically.
Database Cleaner
Database Cleaner supports multiple connections out of the box.
cleaner = DatabaseCleaner[:active_record, {model: CatalogRecord}]
cleaner.strategy = :transaction
cleaner.cleaning do
# code
end
History
View the changelog
Contributing
Everyone is encouraged to help improve this project. Here are a few ways you can help:
- Report bugs
- Fix bugs and submit pull requests
- Write, clarify, or fix documentation
- Suggest or add new features