Model 获取模型的实际数据

Model 获取模型的实际数据,model,elixir,ecto,phoenix,Model,Elixir,Ecto,Phoenix,假设我已经有了一些模型,过了一段时间,我将在另一个函数中更改这个模型的一些字段 有没有什么好方法可以不使用标准的“MyRepo.get(MyModel,model.id)”就从DB获取模型的实际数据(状态) case MyModel.create(attr) do {:ok, model} -> ...some code... # here model will update Task.start(fn -> Model.do_some(model) en

假设我已经有了一些模型,过了一段时间,我将在另一个函数中更改这个模型的一些字段

有没有什么好方法可以不使用标准的“
MyRepo.get(MyModel,model.id)
”就从DB获取模型的实际数据(状态)

case MyModel.create(attr) do
  {:ok, model} ->
    ...some code...
    # here model will update
    Task.start(fn -> Model.do_some(model) end)
    # here I need model with actual data from DB
    {:reply, {:ok, ModelView.render("show.json", model: model)}, socket}
  {:error, message} ->
    ...some code...
end

另外,模型可以有一些预加载的关联

,而不是重新加载模型,您应该使用
模型的结果。do_some(model)
,这将返回更新的模型

因为即使在
Task.start
之后重新加载模型,也无法确定
model.do\u 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
或者在一项新任务中(但我不确定会有什么好处)


但是,要回答您的主要问题:,无法自动重新加载模型


您仍然需要手动预加载关联。

您应该使用
模型的结果,而不是重新加载模型。执行一些(模型)
,这将返回更新的模型

因为即使在
Task.start
之后重新加载模型,也无法确定
model.do\u 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
或者在一项新任务中(但我不确定会有什么好处)


但是,要回答您的主要问题:,无法自动重新加载模型

您仍然需要手动预加载关联

def refresh(%module{id: id}) do
  get(module, id)
end