对于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)
哪一个更好?为什么?
您应该将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
具有副作用(转到数据库),因此它属于您的控制器.