因此,我有一个使用Apartment gem的带有多租户数据库(单个数据库,多个模式)的Rails应用程序。这是根据您在配置文件中指向的列表创建并找到模式名称的方法。就我而言,这些名称指向我的Organization
表上的属性。该表具有subdomain
列,用于确定模式的名称。
例如,每个架构有一个Organization
。我有一些示例架构名称,分别是public
,tool
和pendulum
。这些架构是在创建Organization
记录时创建的,并且您在配置文件中指定的所有表都以该架构为范围。
某些表已从多租户配置中排除,例如users
。它们存在于public
模式中,并且可以被所有其他模式访问(至少我是这样理解的)。就我而言,Organization
是这些排除的表之一。
当我尝试从一个特定于架构的表(例如,假设Tour
)设置对组织的引用时,出现以下ActiveRecord(Rails的内置ORM策略)错误:
ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR: insert or update on table "events" violates foreign key constraint "fk_rails_163b5130b5"
DETAIL: Key (organization_id)=(2) is not present in table "organizations".
我要设置为Organization
上的外键的Tour
的主键是2。
这是我的控制台的一些相关输出:
Apartment::Tenant.current
=> "public"
Organization.count
(0.8ms) SELECT COUNT(*) FROM "public"."organizations"
=> 1
Organization.last.id
Organization Load (0.5ms) SELECT "public"."organizations".* FROM "public"."organizations" ORDER BY "public"."organizations"."id" DESC LIMIT $1 [["LIMIT", 1]]
=> 2
Apartment::Tenant.switch!('tool')
=> nil
Organization.count
(0.5ms) SELECT COUNT(*) FROM "public"."organizations"
=> 1
Organization.last.id
Organization Load (0.7ms) SELECT "public"."organizations".* FROM "public"."organizations" ORDER BY "public"."organizations"."id" DESC LIMIT $1 [["LIMIT", 1]]
=> 2
所以Apartment似乎只在public
模式中寻找组织,并且每次都只找到一个。
但是,进入psql CLI ...
select * from public.organizations;
id | user_id | created_at | updated_at | name | subdomain
----+---------+----------------------------+----------------------------+------+-----------
2 | 1 | 2019-06-05 19:07:34.457148 | 2019-06-05 19:07:34.457148 | Tool | tool
(1 row)
select * from tool.organizations;
id | user_id | created_at | updated_at | name | subdomain
----+---------+----------------------------+----------------------------+------+-----------
1 | 1 | 2019-04-15 09:46:55.239833 | 2019-04-15 09:46:55.239833 | Tool | tool
(1 row)
是的,我较早创建了一个组织并将其删除。由于某种原因,它似乎显示在tool.organizations
中,而不是public.organizations
中。当我创建它时,我100%确信组织仍然限于公共架构。
不过,奇怪的是,Rails控制台仍然告诉我,公共架构中ID为2的组织不存在。当它明确地做。实际上,我尝试更新的旅程仅限于tool
模式,但是从以上查询可以明显看出,我尝试从哪个模式更新都不重要。 Organizations表位于public
中,无论您身在何处,都不应将其范围限制为tool
。
我想念什么?