Rails Multi Tenancy
Aaron McLeod
What is multitenancy?
Multitenancy refers to multiple organizations utilizing one application, but they have their own unique data store.
Apartment Gem
Benefits
- Allows you to connect to the different databases when you want
- Able to use rack middleware (subdomain for a db for example)
- Allows you to create dbs very easily
Caveats
- New migration task on depoyments
- Connection needs to be reset to root after request is done
The Code
Apartment::Database.create(db_name) # creates the new databaseApartment::Database.switch(db_name) # connects to itApartment::Database.switch # connects to default db for current env# tell apartment the db namesApartment.configure do |config| config.database_names = lambda { Client.pluck("db_name") } end
def api_key_checkApartment::Database.switchclient = Client.find_by_api_key(params[:key)if client.nil?raise ActionController::RoutingError.new 'Not Found'elseApartment::Database.switch client.db_nameendend
What about encryption?

attr_encrypted
class Client < ActiveRecord::Base before_create :populate_fields after_create :create_client_db attr_encrypted :name, :encryption_key, key: Settings.encryption_key# ...end
class Project < ActiveRecord::Base
attr_encrypted :name, :description, key: proc { |project| encryption_key }
class << self
def encryption_key
@encryption_key
end
def encryption_key=(value)
if @encryption_key.nil?
@encryption_key = value
end
end
end
end
class Project < ActiveRecord::Base
attr_encrypted :name, :description, key: proc { |project| encryption_key }
class << self
def encryption_key
@encryption_key
end
def encryption_key=(value)
if @encryption_key.nil?
@encryption_key = value
end
end
end
end
class Api::V1::ProjectsController < ApplicationController before_filter :api_key_check def create Project.encryption_key = @client.encryption_key @project = Project.create project_paramsendend
Rails multi tenancy
By agmcleod
Rails multi tenancy
- 2,020