我应该在 Elixir Phoenix 的控制器或模型中使用 Ecto.Repo 吗?
Should I use Ecto.Repo in Controller or Model for Elixir Phoenix?
对于 Phoenix 的控制器中的一些查询,我有两个计划
方案一:
defmodule Demo.UserController do
# ...
def index do
# This is just for example
# The point is Repo in used here
Repo.all(User)
end
end
方案二:
defmodule Demo.User do
# ...
def all do
# Put all Repo API and building query logic in Model
Repo.all(__MODULE__)
end
end
我更喜欢方案二,因为在大多数情况下,我可以把所有取数据的逻辑都放在Model中。
但我发现官方指南使用方案1(docs/model) and Phoenix default code alias Repo
in Controller instead of 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
的调用有副作用(转到数据库)所以它属于您的控制器。
对于 Phoenix 的控制器中的一些查询,我有两个计划
方案一:
defmodule Demo.UserController do
# ...
def index do
# This is just for example
# The point is Repo in used here
Repo.all(User)
end
end
方案二:
defmodule Demo.User do
# ...
def all do
# Put all Repo API and building query logic in Model
Repo.all(__MODULE__)
end
end
我更喜欢方案二,因为在大多数情况下,我可以把所有取数据的逻辑都放在Model中。
但我发现官方指南使用方案1(docs/model) and Phoenix default code alias Repo
in Controller instead of 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
的调用有副作用(转到数据库)所以它属于您的控制器。