2016-11-18 3 views
1

У меня есть модель, которую я хотел бы разбить на несколько таблиц базы данных. Все данные и функциональные возможности будут одинаковыми, поэтому я хотел бы использовать один и тот же модуль/ecto.model, но просто иметь таблицу, в которой он сохранен, в разных. Кроме того, я не буду знать до тех пор, пока не будет указано имя таблицы.Как вы можете динамически установить имя таблицы схем для модели ecto

Может ли кто-нибудь предложить способ динамически установить имя таблицы SCHEMA?

+0

Я не знаю ответа на ваш вопрос, но еще одним соображением может быть использование одного и того же имени таблицы, но использование разных репозиториев. Или, если вы используете postgres, вы можете взглянуть на citus, который обрабатывает прозрачное изображение в приложении. – Homan

+1

Для выбора вы можете передать кортеж табличного имени/схемы следующим образом: 'from p in {" posts2 ", Post}, где p.id == 1'. Для вставки вы можете передать имя таблицы в 'Repo.insert_all (" posts2 ", [...])', но я не уверен, как это сделать с помощью 'Repo.insert'. – Dogbert

+0

@ Dogbert спасибо, ваш комментарий спас мне много времени сегодня вечером! –

ответ

3

Большинство функций, ожидающих схемы, также принимают кортеж в виде {"source", Schema}, где источником является имя таблицы. Источник также правильно поддерживается структурами, поэтому, если вы выбираете из определенного источника, при его обновлении/удалении он будет исправлен в правильной таблице. Существует также Ecto.put_meta(struct, source: "source") для аннотирования уже созданных структур.

Эти функции были также недавно расширены, чтобы охватить больше случаев использования, вы можете увидеть больше в этом выпуске: #1797.

+0

Спасибо большое! 'Ecto.put_meta (struct, source:" source ")' оказался чрезвычайно полезным при вставке/обновлении. Можно ли использовать тот же метод при извлечении данных с помощью 'Ecto.Repo.get_by/3'? –

+0

Я понял. Мы можем передать '{" source ", Schema}' в качестве первого аргумента в 'Ecto.Repo.get_by/3'. Спасибо за вашу помощь. –