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
After placing this in your gem file run bundle to install this.
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
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:
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
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.
Source : https://github.com/ErwinM/acts_as_tenant