Multi-tenant Architecture with PostgreSQL Schemas

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.
Source : https://github.com/ErwinM/acts_as_tenant
 

Subscribe For Latest Updates

Related Posts

Leave a Comment

Your email address will not be published. Required fields are marked *

en_USEnglish