Вместо перезагрузки вашей модели вы должны использовать результат Model.do_some(model)
, который должен вернуть обновленную модель.
Поскольку даже если вы перезагрузите свою модель после Task.start
, вы не можете быть уверены,что Model.do_some(model)
уже выполнено, поскольку оно было запущено в новой задаче асинхронно.
Так что вы либо делаете это в том же процессе, что и вызывающая сторона:
case MyModel.create(attr) do
{:ok, model} ->
model = Model.do_some(model)
{:reply, {:ok, ModelView.render("show.json", model: model)}, socket}
{:error, message} ->
end
, либо в новой задаче(Но я не уверен, какая выгода будет)
case MyModel.create(attr) do
{:ok, model} ->
task = Task.start(fn -> Model.do_some(model) end)
case Task.yield(task) || Task.shutdown(task) do
{:ok, model} ->
{:reply, {:ok, ModelView.render("show.json", model: model)}, socket}
_ -> # Timeout reached
end
{:error, message} ->
end
Но все же, чтобы ответить на ваш главный вопрос: Нет , нет способа автоматически перезагрузить вашмодель. Однако вы можете определить вспомогательный метод в своем репо:
def refresh(%module{id: id}) do
get(module, id)
end
Вам все равно придется предварительно загружать ассоциации вручную.