Account Scopper

Account Scopper aims to make conversion from a single account to multi-accounts application as easy as possible.

Simply set your current_account before each request and the scoping will be done on it’s own.

Install

If new to gemcutter first run

sudo gem install gemcutter
sudo gemcutter tumble

Then run

sudo gem install 

If using rails, in your ‘config/environment.rb`

config.gem 'account_scopper'

Usage

To convert your application, you will need to make few changes :

  1. Create an Account model and Accounts table

  2. Add account_id to your existing models (except Account of course)

  3. Define relationship between Account and other models

  4. Add the class variable “current_account” to the model Account

  5. Initialize Account.current_account before every request (eg: app/controllers/application.rb)

eg:

# app/model/account.rb

class Account < ActiveRecord::Base
  cattr_accessor :current_account

  has_many :users
end

# app/model/user.rb

class User < ActiveRecord::Base  
  belongs_to :account
end

# app/controllers/application.rb

class ApplicationController < ActionController::Base
  before_filter :set_current_account
  # ...

  private
    # Don't forget that @current_account should be properly setup to be an Account object
    # for this purpose you can use the plugin AccountLocation from David Heinemeier Hansson
    def 
      Account. = @current_account
    end
end

What it does

The plugin overwrite few methods from ActiveRecord::Base

To have a better understanding of what it does, the best way is still to look at the code itself and the tests.

Helpers

As account_scopper scopes all database requests, ‘validates_uniqueness_of` will also scope to the current account.

In some cases, you may like to make sure that somethings remain unique to your whole system.

(eg: the user login or email if logging in from a common page for all accounts)

For this purpose, you can use ‘validates_global_uniqueness_of`. This validations will make sure your attribute is unique over all accounts.

Warning

If using manually generated database requests like find_by_sql, … you’ll have to do your own scoping

Note on Patches/Pull Requests

  • Fork the project.

  • Make your feature addition or bug fix.

  • Add tests for it. This is important so I don’t break it in a future version unintentionally.

  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but

    bump version in a commit by itself I can ignore when I pull)
    
  • Send me a pull request. Bonus points for topic branches.

Copyright © 2009 Sebastien Grosjean. See LICENSE for details.