Въпреки че открих много примери за мултинаемане в приложенията на Rails, когато за първи път се заех да го направя, не можах да намеря и такъв, който да ме накара да се чувствам напълно комфортно. Но най-накрая имам решение, от което съм доволен.
Започнах с 'multitenancy with scopes' railscast
http://railscasts.com/episodes/388-multitenancy-with-scopes
след това разгледахме как да работим с множество наемания с поддомейни devise, използвайки това ръководство:
https ://github.com/plataformatec/devise/wiki/How-To:--Isolate-users-to-log-into-a-single-subdomain
Но не го приемах за номинална стойност; Гмурнах се, за да разбера наистина как devise работи по този начин.
След като разполагах с всичко това, бях готов за скъпоценния камък с много наематели:
https://github.com/wireframe/multitenant
Но не спрях дотук. скъпоценният камък с много наематели изисква да кажете Multitenant.with_tenant винаги, когато искате нещата да бъдат обхватени по подходящ начин, затова създадох TenantController, който изглежда така:
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
и след това всеки контролер, който искам да бъде обхванат от наемател, наследява от TenantController, а не ApplicationController. По този начин не трябваше да помня нищо в детайлите на контролера, той „просто работеше“. Единственото нещо, за което разработчиците трябваше да помислят, беше „това контролер ли е, който обработва данни за наематели?“
Въпреки че това все още зависи от това, че разработчиците правят няколко неща правилно (наследяване от правилния контролер, казвайки „acts_as_multitenant“ в модела, това работи много добре на практика.