对于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
我更喜欢Plan2。因为在大多数情况下,我可以将所有关于获取数据的逻辑放在Model中。
但是我发现官方指南在Controller中使用Plan 1(docs / model)和Phoenix默认代码alias Repo
,而不是Model(web / web.ex)
哪一个更好?又为什么呢
您应该将回购呼叫保留在控制器内。如果您的逻辑很复杂,则应考虑将逻辑移到其自己的服务模块中。
您应该将模型函数视为纯函数(没有副作用),因此它们应仅对数据起作用。因此,例如,您可以拥有:
def alphabetical(query)
order_by(query, [u], u.name)
end
但是您不应该具有:
def alphabetical(query)
order_by(query, [u], u.name)
|> Repo.all
end
这是因为查询纯粹是数据,对的调用Repo.all
具有副作用(将转到数据库),因此它属于您的控制器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句