In Multi-tenant architecture by using single instance it serves multiple accounts. Each account is called a tenant.

There are so many different approaches to implement multi-tenancy architecture using traditional or by using any gems. By comparing all those I found the simplest way of implementing Multi-tenancy that is with “Act as tenant” gem

Representation of Gem

gem 'acts_as_tenant'

After placing this in your gem file run bundle to install this.

Usage:

It sets the current tenant by using subdomain and adds the ability to scope models to a tenant.

For setting current tenant place the below code in your application controller

Creating Tenant Account Model

class AddcolumnsToAccounts < ActiveRecord::Migration def up add_column :accounts, :sub_domain, :string end end

set_current_tenant_by_subdomain(:account, :subdomain)

Manual approach to set current tenant

class ApplicationController < ActionController::Base set_current_tenant_through_filter before_filter :find_the_current_tenant def find_the_current_tenant current_account = Account.find_by_subdomain(subdomain: 'subdomain') set_current_tenant(current_account) end end

Scoping your models

class AddAccountToColleges < ActiveRecord::Migration def up add_column :colleges, :account_id, :integer add_index :colleges, :account_id end end class College < ActiveRecord::Base acts_as_tenant(:account) end

Acts as tenant adds a method to validate uniqueness, validates_uniqueness_to_tenant

If you need to validate for uniqueness, you can do by using following code:

validates_uniqueness_to_tenant :title

And more over default rails validates_uniqueness_of are also available.

For specifying foreign key use the following syntax

acts_as_tenant(:account, :foreign_key => 'AccountID')

by default it takes account_id

Configuration

An initializer can be created to control option in ActsAsTenant. You can change the configuration options in config/initializers/acts_as_tenant.rb

ActsAsTenant.configure do |config| config.require_tenant = false end

config.require_tenant when set to true will raise an ActsAsTenant::NoTenant error whenever a query is made without a tenant set.