A digital illustration of a large apartment building representing multi-tenancy in Rails. Each compartment functions independently, symbolizing isolated data environments for different tenants. At the center, the Ruby on Rails logo glows, highlighting its central role in the multi-tenancy architecture.

Implementing Multi-Tenancy in Rails with Apartment-gem

Database, Schema, and Column Approaches

--

Multi-tenancy is an architecture where a single instance of the software serves multiple tenants (clients or customers). In Rails, implementing multi-tenancy can be a complex task, but with the right tools and strategies, it becomes manageable. This article focuses on using the Apartment gem for achieving multi-tenancy at three levels: database, schema, and column.

Understanding Multi-Tenancy Levels

  • Database-Level Tenancy: Each tenant has its own database. This is the most isolated approach but can lead to database sprawl.
  • Schema-Level Tenancy: Each tenant has its own schema within the same database. This balances isolation with resource efficiency.
  • Column-Level Tenancy: A single database and schema where data is distinguished by tenant-specific columns. This is the least isolated but most efficient.

Implementing Database-Level Tenancy with Apartment

To start with database-level tenancy:

  • Install Apartment: Add gem apartment to your Gemfile and run bundle install.
  • Configure Apartment: Set up Apartment to use different databases. This involves configuring `config/initializers/apartment.rb` to use the `Database` elevator, which switches between databases based on request subdomains or other criteria.
Apartment.configure do |config|
config.excluded_models = ["Tenant"] # Model that should be shared
config.use_schemas = false
# … other configurations …
end
  • Create Tenant Models: Create a Tenant model that will handle the creation and management of separate databases for each tenant.
  • Switching Databases: Implement logic to switch databases based on the current tenant context.

Implementing Schema-Level Tenancy

Schema-level tenancy involves a similar setup, but with a key difference in configuration:

  1. Configure Apartment for Schema-Based Tenancy: Set config.use_schemas = true in the Apartment configuration.

--

--

Alessio Bussolari

Ruby on Rails programmer since 2009. Current CTO at COSMIC SRL, where I lead the team in creating innovative solutions.