用途:为采用 Basecamp activerecord-tenanted gem 的 Rails 应用提供 SQLite 每租户一库的专家指引,适用于需要为每个租户分配独立 SQLite 文件的多租户场景。身份、会话与会话所在的租户行存放于全局数据库,产品数据存放于 storage/tenants/{env}/{tenant_key}/main.sqlite3。该模型即 Herald/Cortex/Innkeeper 模式,与 Nebula 的 acts_as_tenant(单一库加 workspace_id)、Fizzy 路径租户(单一库加 Current.account 与 SCRIPT_NAME 前缀)不同;若已使用后两者,不应引入此 gem。主要能力:以 GlobalRecord 与 ApplicationRecord 两个抽象基类区分全局库与租户库,任何租户查询都必须处于 with_tenant 或 Current.tenant= 之下,包括任务与 rake;由 URL(或 Current)选择分片,需禁用 gem 默认子域解析器;后台任务须重新进入租户,不能依赖 Active Job 自动携带分片,应传全局标识并在 perform 内用 with_tenant 包裹;可开启 tenanted_rails_records 使 Active Storage 等存入租户库。使用方式:在 Gemfile 添加 gem "activerecord-tenanted";在 database.yml 为各环境配置 primary(tenanted: true)与 global;迁移分 db/global_migrate 与 db/migrate,执行 bin/rails db:migrate 与 bin/rails db:migrate:global;在初始化器设置 tenant_resolver 返回 nil、生产 default_tenant 为 nil;通过控制器 concern 从 URL 解析租户并在创建租户后调用 ApplicationRecord.create_tenant(tenant_key)。限制与注意:不得在已采用 acts_as_tenant 或 Fizzy 共享模式的库中引入;Identity/Session 不应放在 ApplicationRecord;任务中不得无 with_tenant 直接 User.find;生产环境切勿设置 default_tenant;租户库主键为 UUID;无当前租户时无法生成 Blob key。资料未提供收费、价格或平台信息。
activerecord-tenanted
通用与其它
更新于 10-16 00:20