README.md
Mongoid::Tenant
===============
[![Gem Version](https://badge.fury.io/rb/mongoid-tenant.svg)](http://badge.fury.io/rb/mongoid-tenant)
[![Dependency Status](https://gemnasium.com/nofxx/mongoid-tenant.svg)](https://gemnasium.com/nofxx/mongoid-tenant)
[![Build Status](https://secure.travis-ci.org/nofxx/mongoid-tenant.svg)](http://travis-ci.org/nofxx/mongoid-tenant)
[![Code Climate](https://codeclimate.com/github/nofxx/mongoid-tenant/badges/gpa.svg)](https://codeclimate.com/github/nofxx/mongoid-tenant)
[![Coverage Status](https://coveralls.io/repos/nofxx/mongoid-tenant/badge.svg?branch=master&service=github)](https://coveralls.io/github/nofxx/mongoid-tenant?branch=master)
## Mongoid::Tenant
Simple multi tenant for mongoid models!
## Nice Tenancy for Mongoid Documents
This library is a simple way to split your client data between databases.
To mongo it's pretty trivial to use multiple databases. Mongoid helps too.
Supposing you have a Bike SaaS where each Shop stores:
## Tenancy
```
class Shop
include Mongoid::Document
include Mongoid::Tenancy
tenant_key :url
end
```
## Tenant
```
class Bike
include Mongoid::Document
include Mongoid::Tenant
end
```
And that's all.
## Helpers
Codebase is really is small. Check lib/
### Tenancy#tenancy!
Helper to set the current namespace.
```
Shop.first.tenancy!
```
### Tenancy.tenants
Helper to execute something on each tenant namespace.
has_many substitute. Eg:
```
class Shop
...
has_tenant :bikes
end
```
Or raw:
```
Shop.tenants { |tenant| puts "#{tenant} have #{Bike.count} bike(s)" }
```
### Rake Tasks
Index creation is the only thing overwriten in Mongoid.
You'll need to provide which Tenancy to scope. In our example:
```
TENANCY=Shop bundle exec rails db:mongoid:create_indexes
```
## ApplicationController
Write your logic:
```
def app_domain
@domain ||= Shop.find_by(uri: /^#{request.env["SERVER_NAME"]}/)
@domain.tenancy!
end
```
## Populate & Spec
`Mongoid.purge!` won't work. It doesn't know all dbs.
A good alternative:
```
Mongoid.default_client.with(database: db).collections.each(&:drop)
```
If you don't know every db try `Mongoid.default_client.list_databases`.
## Issues
http://github.com/nofxx/mongoid-tenant