当前位置:  开发笔记 > 编程语言 > 正文

我应该在控制器或模型中使用Ecto.Repo用于Elixir Phoenix吗?

如何解决《我应该在控制器或模型中使用Ecto.Repo用于ElixirPhoenix吗?》经验,为你挑选了1个好方法。

对于Phoenix的控制器中的一些查询,我有两个计划

计划1:

defmodule Demo.UserController do
  # ...
  def index do
    # This is just for example
    # The point is Repo in used here
    Repo.all(User) 
  end
end

计划2:

defmodule Demo.User do
  # ...
  def all do
    # Put all Repo API and building query logic in Model
    Repo.all(__MODULE__)
  end
end

我更喜欢Plan 2.因为在大多数情况下,我可以把所有关于在Model中获取数据的逻辑放在一起.

但我发现官方指南使用计划1(docs/model)和Phoenix默认代码alias Repo在Controller而不是Model(web/web.ex)

哪一个更好?为什么?



1> Gazler..:

您应该将Repo呼叫保留在控制器内.如果您的逻辑很复杂,那么您应该考虑将逻辑移到自己的服务模块中.

您应该将模型函数视为纯函数(没有副作用),因此它们只应对数据起作用.例如,您可以:

def alphabetical(query)
  order_by(query, [u], u.name)
end

但你不应该:

def alphabetical(query)
  order_by(query, [u], u.name)
  |> Repo.all
end

这是因为查询纯粹是数据,调用Repo.all具有副作用(转到数据库),因此它属于您的控制器.


在Programming Phoenix中,建议开发人员在测试/模型中具有两个测试文件:user_test.exs和user_repo_test.exs。您可以测试第一个变更集以及不需要存储库的所有内容。好处是您可以在顶部运行“ async:true”。另一个需要存储库,它可能是您测试复杂查询的地方。这完全取决于您要编写哪种测试。
推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有