2016-01-22 3 views
2

изменяющемся ассоциацию данного child от parent_a к parent_b через parent_id в Params оставляет несвежий record.parent объект.Ecto Reload belongs_to Ассоциация После успешного Repo.update

например. (Предположит, что соответствует PARAMS %{child: %{id: '1', parent_id: '6'}})

# ... 
child = Repo.get(Child, child_id) 
|> preload([:parent]) 
changeset = Child.changeset(child, child_params) 

case Repo.update(changeset) do 
    {:ok, child} -> 
    IO.puts child.parent_id # returns '6', or the new, changed `id` 
    IO.puts child.parent.id # returns '5', or the old id 
          # child.parent is stale 
# ... 

Что такое правильный способ для получения нового ассоциированной родительской записи после обновления?

ответ

3

В настоящее время нет встроенного способа сделать это в Ecto. У вас также есть проблема, из-за которой вы не можете использовать preload, поскольку ассоциация уже была предварительно загружена.

Один из вариантов заключается в следующем:

%{child | parent: Repo.get!(Parent, child.parent_id)} 

Вы также можете не называть преднагрузку, пока после вызова Repo.update который будет препятствовать ассоциации уже загружены.

+5

С помощью Ecto 2.0 вы можете передать команду 'force: true' в' Repo.preload', чтобы принудительно перезагрузить уже загруженную ассоциацию. Источник: https://hexdocs.pm/ecto/2.0.0-rc.1/Ecto.Repo.html#c:preload/3 –

+0

@JonathanPerret стоит превратить ваш комментарий в ответ? В современных версиях Ecto это, по-видимому, идиоматический способ решения проблемы. –

 Смежные вопросы

  • Нет связанных вопросов^_^