elixir - 插入后如何使用自定义预加载功能?

标签 elixir phoenix-framework ecto

如何在Repo.insert之后使用自定义模型函数预加载选定的数据?我不会在 Controller 中复制模型中的代码。

在帖子模型中:

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

在 Controller 中:

case Repo.insert(changeset) do
  {:ok, post} ->
    # post = post |> Post.preload_all
    post = Repo.preload(post, [:user, :tags])
end

最佳答案

我能想到的有两种方法:

  1. 传入一个查询,该查询使用 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
    

    请注意,这将多执行一个查询。

  2. 将预加载参数提取到不同的函数并从 Controller 和模型中使用它:

    # 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
    

(所有代码未经测试;如果发现任何语法或其他错误,请指出。)

关于elixir - 插入后如何使用自定义预加载功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38399764/

相关文章:

websocket - 如何正确使用 Phoenix channel 的离开/断开连接?

phoenix-framework - 如何将 Elixir 依赖项导入当前文件/模块

elixir - 在 Phoenix 中获取原始 HTTP 请求正文

Elixir 将日期时间转换为字符串

elixir - 在 Ecto 中插入关联模型

elixir - SPDY 在 Phoenix

erlang - mnesia 表的大小(以 MB 为单位)

匹配 1 次或 2 次出现的正则表达式

elixir - 如何为 Phoenix 请求强制执行 JSON 编码?

json - Phoenix Ecto 如何处理 NoResultsError