获取模型的实际数据

Getting actual data of model

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

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

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

P.s。该模型可以有一些预加载的关联

您应该使用 Model.do_some(model) 的结果而不是重新加载您的模型,这应该 return 更新后的模型。

因为即使您在 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

但是,要回答您的主要问题:,无法自动重新加载您的模型。 However, you can define a helper method in your repo:

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

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