对于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)
哪一个更好?为什么?
答案 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
的调用会产生副作用(转到数据库),因此它属于您的控制器。