Size: a a a

2020 September 07

МВ

Михаил Варнавский... in pro.elixir
кажется понял. Когда создаю changeset использую %Product{}, что для инсерта нормально, а для апдейта нужно из базы тащить данные
источник

B

Bogdan in pro.elixir
Ну да через get_by. Можешь upsert использовать, и тогда не нужно будет тянуть, чтобы обновить.
источник

МВ

Михаил Варнавский... in pro.elixir
а с удалением проще: в схеме поставил on_replace: :delete
источник

AD

Anastasiya Dyachenko in pro.elixir
Михаил Варнавский
Всем привет. Подскажите пожалуйста, как правильно обновить запись в БД вместе со связанными данными? У меня есть таблица
Product
,  она связана с таблицей
AttributeValues
как has_many. Я пытаюсь использовать Ecto.Schema, где полностью подготоваливаю всю структуру, используя
cast_assoc
. Insert работает как нужно, но не могу понять, как правильно сделать update? Нужно сначала удалить связанные данные? Гуглил про
put_assoc
, но что-то не догнал, когда именно его нужно использовать (вроде только при обновлении связанных данных)
чтобы удалять связанные данные, можно использовать update с настройкой on_replace: :delete https://hexdocs.pm/ecto/Ecto.Changeset.html#module-the-on_replace-option. В update нужно передать объект, полученный из БД, например через Repo.get, а для обновления связей нужно предварительно сделать Repo.preload
источник

AD

Anastasiya Dyachenko in pro.elixir
Михаил Варнавский
а с удалением проще: в схеме поставил on_replace: :delete
не успела :D
источник

МВ

Михаил Варнавский... in pro.elixir
угу, так уже и сделал. Только получается многовато запросов для одной операции (один на получение данных, второй на preload, ну и потом update). Вероятно правда, через upsert будет лучше
источник

AD

Anastasiya Dyachenko in pro.elixir
если под upsert вы понимаете insert + on_conflict, то он не работает для связей
источник

МВ

Михаил Варнавский... in pro.elixir
пичаль (
источник

МВ

Михаил Варнавский... in pro.elixir
точно, где-то в документации прям написано, что-то вроде "не надо использовать со связями"... значит это про него ))
источник

AD

Anastasiya Dyachenko in pro.elixir
меньше всего запросов будет если изменять сразу сами связи, без привязки к изначальному объекту
источник

МВ

Михаил Варнавский... in pro.elixir
ну в этом случае как раз put_assoc использовать можно? В статье видел, вроде там так делали
источник

B

Bogdan in pro.elixir
Anastasiya Dyachenko
если под upsert вы понимаете insert + on_conflict, то он не работает для связей
Upsert именно это и значит.

|> Multi.update(:update_product, changeset) - вот эту строчку заменить на Insert и все будет работать. Если установить конфликт на :id и при инсерт попадется продукт с этим id, он просто обновит данные соответствующим образом.
источник

B

Bogdan in pro.elixir
Михаил Варнавский
ну в этом случае как раз put_assoc использовать можно? В статье видел, вроде там так делали
их можно вообще не использовать, очень геморойная астракция ИМХО.
источник

AD

Anastasiya Dyachenko in pro.elixir
Михаил Варнавский
ну в этом случае как раз put_assoc использовать можно? В статье видел, вроде там так делали
там также нужно чтобы была запись из БД с preload
источник

AD

Anastasiya Dyachenko in pro.elixir
Михаил Варнавский
ну в этом случае как раз put_assoc использовать можно? В статье видел, вроде там так делали
под изменением связи, я имела в виду обновление таблицы AttributeValues напрямую
источник

МВ

Михаил Варнавский... in pro.elixir
ну да, можно и так. Но в этом случае тогда руками удалять придется записи.
источник

B

Bogdan in pro.elixir
На примере выше необходимо удалить все AttributeValues.
источник

МВ

Михаил Варнавский... in pro.elixir
Понял, спасибо! Сейчас буду подходящий вариант выбирать ))))
источник

B

Bogdan in pro.elixir
На Product я не вижу ограничений, для использования uspert. Для Атрибутов, если будешь вставлять ключи явным способом без put_assoc и друзей, upsert будет работать аналогичным образом.
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Вопрос: Что поменялось в консолидации протоколов для HashDict и HashSet с 1.9 на 1.10 версию эликсира?
источник