使用 Apartment gem 将单个租户应用程序转换为多租户应用程序

Converting a single Tenant Application to a multitenant one using Apartment gem

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

关于如何做到这一点有什么想法吗?

您似乎没有任何理由不能将其添加到现有的 Rails 应用中。我自己没有这样做过,似乎也没有关于如何迁移现有应用程序的任何具体教程。按照 README and also see the wiki 上显示的 gem 设置说明进行其他配置和说明。尽可能使用 TDD 并期望对您的应用程序进行更改以使一切正常工作。根据您现有应用程序的复杂程度,将决定此迁移的工作量。

您可能希望在浏览器中使用 lvh.me:3000 而不是 localhost:3000 作为根域和端口,并可能在启动本地服务器时使用 rails s -b lvh.me

如果您想安全地破解此分支,我建议您在开始之前对本地开发数据库进行完整备份,以便在出现严重错误时可以回滚到稳定的当前版本。例如,如果您使用的是 Postgres,则有 pg_dump and pg_restore

这种方法与良好的 TDD 相结合应该可以让您到达需要的地方。

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

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

长答,我的经验:

  1. 我备份了数据库中的现有数据以防万一。
  2. 已安装公寓gem
  3. 如果您像我一样使用任何 PostgreSQL 数据库扩展(pgcrypto、uuid-ssop),您需要了解扩展不会自动加载到新创建的模式中。(look here for more details) 执行以下操作:

    • 按照 github readme 的说明创建 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(更多详情here, here and here) like it was my case when creating my first tenant, I discovered that once the extensions are enabled on the public schema, they cannot be installed in the shared schema shared_extensions in this case. So you have to change them from the public schema to the shared_extensions schema. get more details here

    • 如果您在 rails dbconsole

    • 中使用 uuid-ossp ALTER EXTENSION "uuid-ossp" SET SCHEMA shared_extensions
    • 如果您在 rails dbconsole
    • 中使用 pgcrypto ALTER EXTENSION "pgcrypto" SET SCHEMA shared_extensions

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

有关查看这些 github 公寓问题的更多信息。 Here and here。 我花了一天时间弄明白并收集了这些信息。我希望它可以节省您的时间和头痛!