Ton*_*Han 10 elixir ecto phoenix-framework
对于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
Run Code Online (Sandbox Code Playgroud)
计划2:
defmodule Demo.User do
# ...
def all do
# Put all Repo API and building query logic in Model
Repo.all(__MODULE__)
end
end
Run Code Online (Sandbox Code Playgroud)
我更喜欢Plan 2.因为在大多数情况下,我可以把所有关于在Model中获取数据的逻辑放在一起.
但我发现官方指南使用计划1(docs/model)和Phoenix默认代码alias Repo在Controller而不是Model(web/web.ex)
哪一个更好?为什么?
Gaz*_*ler 17
您应该将Repo呼叫保留在控制器内.如果您的逻辑很复杂,那么您应该考虑将逻辑移到自己的服务模块中.
您应该将模型函数视为纯函数(没有副作用),因此它们只应对数据起作用.例如,您可以:
def alphabetical(query)
order_by(query, [u], u.name)
end
Run Code Online (Sandbox Code Playgroud)
但你不应该:
def alphabetical(query)
order_by(query, [u], u.name)
|> Repo.all
end
Run Code Online (Sandbox Code Playgroud)
这是因为查询纯粹是数据,调用Repo.all具有副作用(转到数据库),因此它属于您的控制器.