Search code examples
ruby-on-railsdevisemulti-tenantcancan

Best way to handle multitenancy in Rails 3


I'm building multi-tenant application.

All data isolation is done by TenantID column in each table.

What is the best way to automatically handle multi-tenancy for all tenant models.

Example:

Contacts.new({.....}) should automatically add :tenant => curret_user.tenant
Contacts.where({....}) should also add :tenant => curret_user.tenant

Currently I see something like this in CanCan gem which that can fetch records for specific user parameters. But it is not providing anything for insert and update operation. Or may be I doesn't understand how to do it.

Regards, Alexey Zakharov.


Solution

  • It is possible if you will work with all collections through tenant object.

    Here is sample using Mongoid:

    #Find all products with price > 500 in current tenant scope
    
    current_tenant.products.where(:price.gt => 500) 
    
    #It also work for create and save operations
    
    current_tenant.products.create :name => "apple", :price => 200