Rails: многопользовательская база данных не может найти запись в публичной схеме - PullRequest
1 голос
/ 06 июня 2019

Фон

Итак, у меня есть приложение 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, где бы вы ни находились ...

Чего мне не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...