尽管当我第一次开始使用 Rails 应用程序时,在 Rails 应用程序中发现了许多多租户的示例,但我也找不到一个让我感到完全舒服的示例。但我终于有了一个令我满意的解决方案。
我从“范围多租户”railscast 开始
http://railscasts.com/episodes/388-multitenancy-with-scopes http://railscasts.com/episodes/388-multitenancy-with-scopes
然后使用本指南研究如何使用设计子域进行多租户工作:
https://github.com/plataformatec/devise/wiki/How-To:--隔离用户登录到单个子域 https://github.com/plataformatec/devise/wiki/How-To:--Isolate-users-to-log-into-a-single-subdomain
但我并没有从表面上理解这一点。我深入研究,真正了解该设计是如何工作的。
一旦我完成了所有这些,我就准备好使用多租户 gem:
https://github.com/wireframe/multitenant https://github.com/wireframe/multitenant
但我并没有就此止步。多租户 gem 要求您在任何时候想要适当地限定范围时都使用 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”),但它在实践中效果非常好。