用途:在 Spree 6 上构建 SaaS 型多租户平台,让多个独立商户共享一次部署且数据完全隔离。该能力仅随企业授权 gem spree_enterprise 与 spree_multi_tenant 提供(私有 Keygen 源),不是开源 Spree 的一部分;需向 Spree 确认哪个 gem 版本支持你的 Spree 6 版本。多租户不等于多商店(多商店共享目录与客户,见 spree-data-model)或 Marketplace(共享店面下的多个卖家,见 spree-marketplace)。
隔离方式:Spree::Tenant 为顶层记录,创建租户会建立其商店并运行 Spree 种子数据。采用基于 acts_as_tenant 的行级多租户,每张租户表带 tenant_id 列。gem 将 Spree.base_class 设为 SpreeMultiTenant::Base,使继承该基类的模型自动租户化,唯一性校验(slug、code、SKU)按租户生效。租户上下文内读取自动加 WHERE tenant_id,写入自动设置 tenant_id。当前租户按请求从 host 解析(子域名或自定义域)。一个租户可有多个商店;Spree::Store.default 在多租户代码中不可依赖。员工账号全局可跨租户,客户按租户隔离。
安装要点:需在服务器环境及 CI、预发、生产构建环境设置 KEYGEN_ACCOUNT_ID 与 KEYGEN_LICENSE_KEY;在 server/Gemfile 中通过 Keygen 源添加这两个 gem;Docker 场景用 BuildKit secrets 传递,勿用 ARG/ENV。执行 spree bundle install 后运行生成器 spree generate spree_enterprise:install && spree generate spree_multi_tenant:install。安装后需配置 Spree.root_domain、COOKIE_TLD_LENGTH、host authorization,并在客户模型移除 Devise 的 :validatable(客户邮箱按租户校验,员工邮箱全局)。
编码与限制:新模型继承 SpreeMultiTenant::Base 并带 tenant_id;用 SpreeMultiTenant.with_tenant / without_tenant 控制上下文。控制台、rails runner、rake 任务默认无租户。后台任务需显式遍历租户。insert_all/upsert_all/原生 SQL 会绕过多租户;唯一索引须包含 tenant_id;本地开发勿用 localhost。第三方扩展可能需要 tenant_id 迁移与装饰器。缺失信息:具体价格与授权费用官方资料未提供,参见 Spree 定价页。