Navzdory tomu, že jsem našel mnoho příkladů vícenásobného pronájmu v aplikacích Rails, když jsem se do toho poprvé pustil, nenašel jsem ani jeden, ve kterém bych se cítil naprosto pohodlně. Ale konečně mám řešení, se kterým jsem spokojený.
Začal jsem s 'multitenancy with scopes' railscast
http://railscasts.com/episodes/388-multitenancy-with-scopes
poté jsme se podívali na to, jak zajistit, aby multi-tenancy fungoval s návrhem subdomén pomocí tohoto průvodce:
https ://github.com/plataformatec/devise/wiki/How-To:--Isolate-users-to-log-into-a-single-subdomain
Ale nebral jsem to jako nominální hodnotu; Ponořil jsem se do toho, abych skutečně pochopil, jak takový návrh fungoval.
Jakmile jsem to všechno měl na svém místě, byl jsem připraven na klenot pro více nájemců:
https://github.com/wireframe/multitenant
Ale nezůstal jsem jen u toho. drahokam pro více nájemců vyžaduje, abyste řekli Multitenant.with_tenant, kdykoli chcete, aby byly věci správně vymezeny, takže jsem vytvořil TenantController, který vypadá takto:
around_filter :scope_current_tenant
def scope_current_tenant
begin
Firm.current = Firm.find_by_subdomain!(request.subdomain)
rescue
raise ActionController::RoutingError.new('Not Found')
end
Multitenant.with_tenant Firm.current do
yield
end
ensure
Firm.current = nil
end
end
a poté jakýkoli řadič, který chci, aby byl vymezen tenantem, zdědí z TenantController spíše než ApplicationController. Tím pádem jsem si nemusel pamatovat nic v detailech ovladače, ten ‚prostě fungoval‘. jediná věc, na kterou museli vývojáři myslet, bylo „je toto kontrolér, který zpracovává data tenantů?“
I když to stále závisí na vývojářích, kteří udělají několik věcí správně (zdědí to od správného ovladače a v modelu říkají 'acts_as_multitenant', v praxi to funguje opravdu dobře.