【问题标题】:Converting a single Tenant Application to a multitenant one using Apartment gem使用 Apartment gem 将单个租户应用程序转换为多租户应用程序
【发布时间】:2020-02-05 02:07:41
【问题描述】:

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

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

【问题讨论】:

标签: ruby-on-rails ruby multi-tenant


【解决方案1】:

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

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

长答案,我的经验:

  1. 我备份了数据库中的现有数据以防万一。
  2. 安装的公寓宝石
  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(更多详细信息hereherehere)就像我在创建第一个租户时的情况一样,我发现一旦在public 架构上启用了扩展,在这种情况下,它们不能安装在共享模式shared_extensions 中。因此,您必须将它们从公共架构更改为 shared_extensions 架构。获取更多详情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 问题。 Herehere。 我花了一天时间弄清楚并收集这些信息。我希望它可以节省您的时间和头痛!

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 2011-05-05
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多