Я должен использовать 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 9

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 имеет побочные эффекты (переход в базу данных), поэтому он принадлежит ваш контроллер.