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

时间:2015-12-17 17:26:38

标签: elixir phoenix-framework ecto

对于Phoenix的Controller中的某些查询,我有两个计划

计划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中获取数据的逻辑。

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

哪一个更好?为什么?

1 个答案:

答案 0 :(得分:17)

您应该将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的调用会产生副作用(转到数据库),因此它属于您的控制器。