Фон
Итак, у меня есть приложение Rails с многопользовательской базой данных (одна база данных, несколько схем) с использованием Apartment gem . Это создает и находит имена схем на основе списка, на который вы указываете в своем файле конфигурации. В моем случае эти имена указывают на атрибуты в моей таблице Organization
. В этой таблице есть столбец subdomain
, который определяет имена схем.
Так, например, у меня есть один Organization
на схему. Вот несколько примеров имен схем: public
, tool
и pendulum
. Эти схемы создаются при создании записи Organization
, и все таблицы, указанные в файле конфигурации, попадают в эту схему.
Существуют определенные таблицы, которые исключены из конфигурации мультитенанта, например users
. Они существуют в схеме public
и доступны всем другим схемам (по крайней мере, я так понимаю). В моем случае Organization
является одной из этих исключенных таблиц.
Моя проблема
Когда я пытаюсь установить ссылку из одной специфической для схемы таблицы (например, Tour
) на организацию, я получаю следующую ошибку ActiveRecord (встроенная стратегия ORM Rails):
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".
Debugging
Первичный ключ 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
Таким образом, квартира, похоже, правильно ищет только организации в схеме public
, и каждый раз находит только одну.
Однако после входа в PSI 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 все еще говорит мне, что организации в публичной схеме с идентификатором 2 не существует. Когда это ясно. Тур, который я пытаюсь обновить, фактически ограничен схемой tool
, но, как видно из приведенных выше запросов, не должно иметь значения, с какой схемы я пытаюсь обновить. Таблица организаций существует в public
, и ее не следует ограничивать tool
, где бы вы ни находились ...
Чего мне не хватает?