luz*_*zny 2 elixir ecto phoenix-framework
如何使用自定义模型功能来预加载选定的数据Repo.insert?我不会在控制器中复制模型中的代码。
在帖子模型中:
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:
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
(所有代码未经测试;如果发现任何语法或其他错误,请指出。)
| 归档时间: | 
 | 
| 查看次数: | 4289 次 | 
| 最近记录: |