Rails:多租户数据库无法在公共架构中找到记录

时间:2019-06-05 23:39:19

标签: ruby-on-rails database postgresql activerecord multi-tenant

背景

因此,我有一个使用Apartment gem的带有多租户数据库(单个数据库,多个模式)的Rails应用程序。这是根据您在配置文件中指向的列表创建并找到模式名称的方法。就我而言,这些名称指向我的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模式,但是从以上查询可以明显看出,我尝试从哪个模式更新都不重要。 Organizations表位于public中,无论您身在何处,都不应将其范围限制为tool

我想念什么?

0 个答案:

没有答案