首页 > 解决方案 > 使用 Apartment gem 将单个租户应用程序转换为多租户应用程序

问题描述

我已经构建了一个单租户 Rails 应用程序,其中所有核心功能都已准备好发布。但我现在想使用公寓 gem使其成为多租户。我发现的大多数教程都展示了如何从头开始。但是我没有找到关于如何将现有项目转换为内置多租户的指示。根据我的研究,我发现所有模型都需要在迁移中添加租户 ID。如何轻松地将其添加到所有现有模型中?安装 gem 并运行生成器就足够了吗?我正在运行一个rails 5包含近 30 个模型的 API 应用程序,并在一个环境中使用graphqlruby ​​。Ubuntu 18.04

关于如何做到这一点的任何想法?

标签: ruby-on-railsrubymulti-tenant

解决方案


感谢@lacostenycoder 为我指明了正确的方向。这就是我所做的。

简短回答:是的,安装 gem、运行生成器和创建租户模型就足够了。Apartment 读取您的架构并为租户创建架构。

长答案,我的经验:

  1. 我备份了数据库中的现有数据以防万一。
  2. 安装的公寓宝石
  3. 如果您像我一样使用任何 PostgreSQL 数据库扩展(pgcrypto、uuid-ssop),您需要了解扩展不会自动加载到新创建的模式中。(查看此处了解更多详细信息)执行以下操作:

    • 按照github 自述文件的说明创建shared_extensions架构
    • 创建您的第一个租户。如果它有效,一切都很好。但...
    • 如果这不起作用,我的意思是当您创建租户时,您会收到类似的错误 ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR: function gen_random_uuid() does not exist
    • 或者 ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR: function uuid_generate_v4() does not exist(更多细节在这里这里这里)就像我在创建我的第一个租户时的情况一样,我发现一旦在public架构上启用了扩展,在这种情况下它们就不能安装在共享架构shared_extensions中。因此,您必须将它们从公共架构更改为shared_extensions架构。在此处获取更多详细信息

    • 如果你 ALTER EXTENSION "uuid-ossp" SET SCHEMA shared_extensions你的rails dbconsole

    • 如果你 ALTER EXTENSION "pgcrypto" SET SCHEMA shared_extensions你的rails dbconsole

正确设置并创建第一个租户后,公寓 gem 将为您的租户创建所有模型。

欲了解更多信息,请查看有关公寓的这些 github 问题。这里这里。我花了一天时间弄清楚并收集这些信息。我希望它可以节省您的时间和头痛!


推荐阅读