插入后如何使用自定义预加载功能?
How to use custom preload function after insert?
Repo.insert
后如何使用自定义模型函数预加载选中的数据?我不会在控制器中复制模型中的代码。
在Post型号中:
def preload_all(query) do
tags = from(t in Tag, select: %{id: t.id, value: t.id})
from b in query, preload: [:user, tags: ^tags]
end
在控制器中:
case Repo.insert(changeset) do
{:ok, post} ->
# post = post |> Post.preload_all
post = Repo.preload(post, [:user, :tags])
end
我能想到的有两种方式:
传入一个查询,该查询使用 id
= post.id
:
获取 post
case Repo.insert(changeset) do
{:ok, post} ->
post = Repo.one(Post.preload_all(from p in Post, where: p.id == ^post.id))
end
请注意,这将执行一个比要求多的查询。
将预加载参数提取到不同的函数并从控制器和模型中使用它:
# Post Model
def preload_args do
tags = from(t in Tag, select: %{id: t.id, value: t.id})
[:user, tags: tags]
end
def preload_all(query) do
from b in query, preload: ^preload_args
end
# Controller
case Repo.insert(changeset) do
{:ok, post} ->
post = Repo.preload(post, Post.preload_args)
end
(所有代码均未经测试;如果发现任何语法或其他错误,请指出。)
Repo.insert
后如何使用自定义模型函数预加载选中的数据?我不会在控制器中复制模型中的代码。
在Post型号中:
def preload_all(query) do
tags = from(t in Tag, select: %{id: t.id, value: t.id})
from b in query, preload: [:user, tags: ^tags]
end
在控制器中:
case Repo.insert(changeset) do
{:ok, post} ->
# post = post |> Post.preload_all
post = Repo.preload(post, [:user, :tags])
end
我能想到的有两种方式:
传入一个查询,该查询使用
获取 postid
=post.id
:case Repo.insert(changeset) do {:ok, post} -> post = Repo.one(Post.preload_all(from p in Post, where: p.id == ^post.id)) end
请注意,这将执行一个比要求多的查询。
将预加载参数提取到不同的函数并从控制器和模型中使用它:
# Post Model def preload_args do tags = from(t in Tag, select: %{id: t.id, value: t.id}) [:user, tags: tags] end def preload_all(query) do from b in query, preload: ^preload_args end # Controller case Repo.insert(changeset) do {:ok, post} -> post = Repo.preload(post, Post.preload_args) end
(所有代码均未经测试;如果发现任何语法或其他错误,请指出。)