ruby-on-rails - Rails:多租户数据库在公共模式中找不到记录
问题描述
背景
所以我有一个带有多租户数据库(单个数据库,多个模式)的 Rails 应用程序,使用Apartment gem。它的作用是根据您在其配置文件中指向的列表创建和查找模式名称。就我而言,这些名称指向我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
架构,但从上述查询中可以明显看出,我尝试从哪个架构进行更新并不重要。组织表存在于 中public
,并且不应局限于tool
,无论您身在何处...
我错过了什么?
解决方案
推荐阅读
- c++ - Intel OneAPI FFT 分段错误和总线错误
- python - 进程未到达 try 块内的一行
- javascript - 点击链接后如何关闭汉堡包
- javascript - 赛普拉斯不会等待响应表单 API 调用
- python - 写入输出文件需要相当长的时间
- masstransit - Masstransit 如何与 RabbitMq 断开连接
- javascript - Vuejs注册组件并获取您是否正确注册了组件?错误
- ios - 如何在 iOS 的 MBCalendarkit 中隐藏日期行
- javascript - 按特定顺序计算数字列表时出错 - JavaScript 引擎错误或 JavaScript 语言错误?
- html - Bootstrap Selectpicker 未显示完整选项