I suppose it's about time I updated my Simple Rails Multi-Tenancy post to use the latest rails 3.1.1. Not much has changed from the 3.0 beta to 3.1.1 in terms of the method I use to achieve multi-tenancy but the code has become a bit cleaner (but the patch required is a bit larger). This time around I'll skip the commands and just go straight to the code itself.
With some recent commits to rails comes the ability to have a
default_scope with a lambda that gets evaluated at query time. Combine that with a multi-tenant column scoped database structure (wow, quite the mouthful) and you've got an quick and painless way to partition your tenant data without scattering code everywhere.
The methods that come with the standard
ActionPack::Helpers::FormBuilder cover most cases of what you need to do but if you need to do something it doesn't have a method for, things can get a little ugly.
In my case I wanted to create a helper for autocompleted fields that all had the same attributes but different arguments (the urls).
data-autocomplete, normally when you wanted to have the field autocompleted, you would pass in the attribute to the form helper
f.text_field :username, :'data-autocomplete' => users_path(:json)
While there is nothing bad about doing this, you end with a bunch of
:'data-autocomplete' scattered about in your views which makes it harder to change down the road if you were to switch your JS implementation.
A nicer way is to have your own form builder method called
autocomplete_field which requires two arguments (
url) that adds the
:'data-autocomplete' option (which is now in one place and easily changed) for you. Best part is this can be done with only one helper file.