获取模型的实际数据
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
您仍然需要手动预加载关联。
假设我已经有了一些模型,一段时间后我将在另一个函数中更改此模型的某些字段。
有没有什么好的方法可以在不使用标准“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
您仍然需要手动预加载关联。