Size: a a a

2019 March 13

IB

Ilya Borovitinov in pro.elixir
Возник такой вопрос. А где лучше всего ставить Repo.insert/Repo.transaction с точки зрения разбиения на модули и тестирования?

Вопрос в контексте, что тестировать проще и быстрее Ecto.Changeset или Ecto.Multi, просто проходясь по изменениям, но при этом вытаскивать Repo.insert из функции Foo.create_bar(params \\ %{}) (как, например, любит создавать феникс) и возвращать changeset или то же самое multi - мне кажется странным почему-то
источник

IB

Ilya Borovitinov in pro.elixir
Не могу понять, где правильнее всего эту границу проводить
источник

AD

Anastasiya Dyachenko in pro.elixir
возвращается не changeset созданная по параметрам структура
источник

AD

Anastasiya Dyachenko in pro.elixir
changeset только в случае ошибки возвращается
источник

AD

Anastasiya Dyachenko in pro.elixir
в смысле из Repo.insert, или в чем проблема с предсозданным контекстом?
источник

IB

Ilya Borovitinov in pro.elixir
Anastasiya Dyachenko
changeset только в случае ошибки возвращается
В функции Foo.create_bar/1, ты имеешь в виду?
источник

AD

Anastasiya Dyachenko in pro.elixir
да
источник

IB

Ilya Borovitinov in pro.elixir
Ну, а скажем если мне нужно это создание запихнуть в мульти? просто через Multi.run и пофиг?
источник

IB

Ilya Borovitinov in pro.elixir
(ну, не всегда. иногда bar создается просто, иногда как часть другого процесса)
источник

AD

Anastasiya Dyachenko in pro.elixir
я вообще multi не использовала, но по идее его тоже можно в контексте использовать
источник

AD

Anastasiya Dyachenko in pro.elixir
имхо все что касается changeset и Repo.* надо описывать в контексте
источник

IB

Ilya Borovitinov in pro.elixir
Просто в доке по Ecto.Multi указан один из его "плюсов" - скорость при тестировании, потому что это просто структура в памяти, как changeset. Но для этого публичные функции должны этот multi возвращать
источник

IB

Ilya Borovitinov in pro.elixir
Ну вот да, мне тоже так кажется, я не хочу выносить Repo за контекст. Но делать две функции, типа create_bar/1 и create_bar_changeset/1 только ради тестирования кажется очень странным
источник

AD

Anastasiya Dyachenko in pro.elixir
да наверно это и подразумевается, писать функции с аргументом в виде multi и результатом
источник

AD

Anastasiya Dyachenko in pro.elixir
на счет тестирования, по идее можно создавать multi, отдавать его в функцию, а после проверять через to_list
источник

IB

Ilya Borovitinov in pro.elixir
Во, я сформулировал
источник

IB

Ilya Borovitinov in pro.elixir
https://hexdocs.pm/ecto/Ecto.Multi.html#module-example

Вот тут приводится функция в модуле, которая нуждается в прогоне через Repo.Transaction для реального исполнения
источник

IB

Ilya Borovitinov in pro.elixir
И я не могу понять, куда это пихать правильно. Типа, делать в контексе модули с реальной работой, а в "корне контекста" только прогон всего через репо?
источник

AD

Anastasiya Dyachenko in pro.elixir
Repo.transaction можно считать исключением и использовать вне контекста, но в этом примере не вижу проблемы поместить его внутрь
источник

AD

Anastasiya Dyachenko in pro.elixir
а поняла, transaction запускает исполнение, тогда есть смысл
источник