Size: a a a

2019 July 29

AN

Alexey Neyman in pro.elixir
Привет! Следующая проблема.

Есть некие программируемые коннекторы, которые хранятся в базе. Они бывают разными, отличаются:

1) Набором параметров (есть и общие)
2) Поведением

Придумал такой подход:

1) Отличающиеся поля хранить в базе как map, а на уровне схемы оперировать виртуальными полями. Используется Decoratex.
2) Разное поведение реализуется протоколами, соответственно, под каждый коннектор свой тип.

Чтобы не копипастить общую для всех коннекторов часть, используется большой жирный макрос.

Примерно так: https://gist.github.com/AlexNeyman/98694ceac2d491f136be0fcbaf978191

Покритикуйте, пожалуйста. Как решить задачу более идиоматично?
источник

P

Pavel in pro.elixir
ExOp?
источник

P

Pavel in pro.elixir
https://github.com/madeinussr/exop мне кажется вписывается в твою задачу идеально, и валидация параметров будет
источник

P

Pavel in pro.elixir
Создатель сабжа вроде как даже тут в чатике есть
источник

AN

Alexey Neyman in pro.elixir
Знаком с Exop, но не пойму как либа мне поможет. Не, я могу придумать как так извернуться, чтобы решить проблему с использованием Exop, но не соображу чем это будет лучше.
Сейчас мне нравится то, что я получаю на выходе: отдельные типы My.SpecialConnector, My.AnotherConnector, в каждом структура со специфичными полями, и проткол, который эти типы каждый по отдельности реализуют.
Но не нравится жирный макрос. Из-за него ощущение, что делаю что-то не так.
источник

NM

Nikita Mistyukov in pro.elixir
ну можно еще на одну таблицу в базе сделать несколько структур, как вариант.
источник

NM

Nikita Mistyukov in pro.elixir
без макроса
источник

m

madeinussr in pro.elixir
+1, я за STI (single table inheritance) в БД и несколько схем и никаких макросов
источник

AN

Alexey Neyman in pro.elixir
Сейчас как раз одна таблица. В ней общие поля сделаны отдельными колонками, а «кастомные» в виде extras (json/map).

Без макроса, это дублировать десятки раз код, описывающий общие поля и валидации.
источник

NM

Nikita Mistyukov in pro.elixir
а, ну наследование хочется) мож ООП язык избрать?))
источник

m

madeinussr in pro.elixir
десятки разных схем?
источник

m

madeinussr in pro.elixir
а в БД есть поле type или типа того?
источник

m

madeinussr in pro.elixir
* в таблице
источник

m

madeinussr in pro.elixir
просто тут подумалось: а можно ли взять и уникальные поля в jsonb описать как новый ecto тип и энкодить/декодить в зависимости от того какое там значение в type

и сразу update: по-ходу, так нельзя cast/dump/load не знают ничего про остальные поля
источник

NM

Nikita Mistyukov in pro.elixir
никто тебе не мешает определить свой экто тип
источник

EA

Evgeniy Abramov in pro.elixir
madeinussr
просто тут подумалось: а можно ли взять и уникальные поля в jsonb описать как новый ecto тип и энкодить/декодить в зависимости от того какое там значение в type

и сразу update: по-ходу, так нельзя cast/dump/load не знают ничего про остальные поля
можно :)
источник

m

madeinussr in pro.elixir
новый тип не мешает
источник

NM

Nikita Mistyukov in pro.elixir
новый тип это как раз определение cast/dump/load
источник

m

madeinussr in pro.elixir
я про cast/dump/load в зависимости от значения другого поля
источник

AN

Alexey Neyman in pro.elixir
Nikita Mistyukov
а, ну наследование хочется) мож ООП язык избрать?))
Спасибо, пошел active record писать 😁
источник