首页 > 解决方案 > Rails:多租户数据库在公共模式中找不到记录

问题描述

背景

所以我有一个带有多租户数据库(单个数据库,多个模式)的 Rails 应用程序,使用Apartment gem。它的作用是根据您在其配置文件中指向的列表创建和查找模式名称。就我而言,这些名称指向我Organization表上的属性。该表有一subdomain列确定模式的名称。

例如,我Organization每个模式都有一个。我拥有的几个示例模式名称是publictoolpendulum。这些模式是在创建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架构,但从上述查询中可以明显看出,我尝试从哪个架构进行更新并不重要。组织表存在于 中public,并且不应局限于tool,无论您身在何处...

我错过了什么?

标签: ruby-on-railsdatabasepostgresqlactiverecordmulti-tenant

解决方案


推荐阅读