я решил попробовать оставить на них только трансляцию ошибок констрейнтов, ну чтобы не делать это руками.
собственно, кейс. есть какая-то сущность, есть код обработки джобы планировщика, в джобе сущность достается, у неё буквально инкрементится одно поле, с ней что-то там делается, и дальше она персистится обратно.
естественно, я написал условно %{entity | seq: entity.seq+1} |> do_something() |> Entity.pack() |> Changeset.change(%{}) |> unique_constraint(...) |> Repo.update!(), и сделать кусок кода, начиная с pack общим. такой общий кусок для всех персистов, чтобы констрейнты в ошибочки транслировать, ну или еще какие-нибудь инварианты проверять.
естественно, это не работает, и очевидно потому, что я тупой(см. change(%{})), конечно там не обновляется нихуя.
естественно, можно выкинуть всё, что про чейнджсет и запихать в апдейт тупо саму сущность, но тогда я не получу красивых ошибочек про констрейнты(и вообще нихуя, получается от чейнджсетов не получу).
конечно, можно заменить Changeset.change(%{}) на Changeset.change(Map.from_struct(entity) |> Map.without([__meta__]), но 1- вот это ручное удаление меты выглядит абсолютно нелепо, 2 - мне нужно таскать с собой "чистый" экземпляр entity, что в этом случае приемлемо, но не во всех ведь.
ЧЯДНТ?
в changeset первым параметром передается оригинальная сущность без изменений и вторым уже изменения
Changeset.cast(structure, attributes, list_to_cast)
не, это вообще полная шляпа для этого места из-за attributes, которые нужно руками поддерживать синхронными со схемой.
Не понял что ты имеешь в виду
короче имхо добавить cast и проблема решена, а еще завернуть это в def something_update(entity, some_data) do entity |> Entity.something_changeset(some_data) |> Repo.update() end и будет вообще прекрасно
а если мне нужно изменить сущность не перед самым персистом, но я не хочу поддерживать дублирующий список полей в cast? без вариантов?
> дублирующий список полей в cast Можно наметапрограммировать в компайле
очень странная логика - сначала менять сущность, потом работать с ней как будто она уже изменена - а потом валидировать
Обсуждают сегодня