169 похожих чатов

Я, короче, продолжаю нихуя не понимать в чейнджсетах. вот допустим,

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

собственно, кейс. есть какая-то сущность, есть код обработки джобы планировщика, в джобе сущность достается, у неё буквально инкрементится одно поле, с ней что-то там делается, и дальше она персистится обратно.
естественно, я написал условно %{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, что в этом случае приемлемо, но не во всех ведь.

ЧЯДНТ?

8 ответов

19 просмотров

в changeset первым параметром передается оригинальная сущность без изменений и вторым уже изменения

Changeset.cast(structure, attributes, list_to_cast)

Alex-Bubnov Автор вопроса
Lama Lover
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 и будет вообще прекрасно

Alex-Bubnov Автор вопроса
Anastasiya Dyachenko
короче имхо добавить cast и проблема решена, а еще...

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

Alex Bubnov
а если мне нужно изменить сущность не перед самым ...

> дублирующий список полей в cast Можно наметапрограммировать в компайле

Alex Bubnov
а если мне нужно изменить сущность не перед самым ...

очень странная логика - сначала менять сущность, потом работать с ней как будто она уже изменена - а потом валидировать

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта