Я должен использовать Ecto.РЕПО в контроллер или модель для эликсир Феникс?
Для некоторого запроса в контроллере 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
Я предпочитаю План 2. Потому что в большинстве ситуаций я могу поместить всю логику о получении данных в модель.
Но я нахожу официальный план использования руководства 1 (docs / model ) и код по умолчанию Phoenix alias Repo
в контроллере вместо Model ( web/web.ex )
Какой из них лучше? И почему?
1 ответ:
Вы должны держать свои вызовы РЕПО внутри вашего контроллера. Если ваша логика сложна, то вы должны рассмотреть вопрос о перемещении логики в свой собственный сервисный модуль.
Вы должны рассматривать свои функции модели как чистые (свободные от побочных эффектов), поэтому они должны действовать только на данные. Так, например, вы могли бы иметь:def alphabetical(query) order_by(query, [u], u.name) end
Но вы не должны были:
def alphabetical(query) order_by(query, [u], u.name) |> Repo.all end
Это связано с тем, что запросы являются чисто данными, вызов
Repo.all
имеет побочные эффекты (переход в базу данных), поэтому он принадлежит ваш контроллер.