【问题标题】: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 会读取您的架构并为租户创建架构。
长答案,我的经验:
- 我备份了数据库中的现有数据以防万一。
- 安装的公寓宝石
-
如果您像我一样使用任何 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 和here)就像我在创建第一个租户时的情况一样,我发现一旦在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 问题。 Here 和 here。
我花了一天时间弄清楚并收集这些信息。我希望它可以节省您的时间和头痛!
【解决方案2】:
似乎没有任何理由不能将它添加到现有的 Rails 应用程序中。我自己没有这样做,似乎也没有任何关于如何迁移现有应用程序的具体教程。按照README 和see the wiki 上显示的gem 设置说明进行操作以获取其他配置和说明。尽可能使用 TDD,并期望对您的应用程序进行更改以使一切正常工作。根据您现有应用的复杂程度,将决定这一举措的工作量。
您可能希望在浏览器中使用lvh.me:3000 而不是localhost:3000 作为根域和端口,并且可能在启动本地服务器时使用rails s -b lvh.me。
如果您想安全地破解此分支,我建议您在开始之前对本地开发数据库进行完整备份,以便在出现严重错误时可以回滚到稳定的当前版本。例如,如果您使用 Postgres,则有 pg_dump 和 pg_restore
这种方法与良好的 TDD 相结合应该可以帮助您到达需要的地方。