2015-12-17 11 views
9

jakiegoś zapytania w Kontrolera Phoenix, są tam dwa plany dla mnieCzy powinienem używać Ecto.Repo w kontrolerze lub modelu dla Elixir Phoenix?

Plan 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 

Plan 2:

defmodule Demo.User do 
    # ... 
    def all do 
    # Put all Repo API and building query logic in Model 
    Repo.all(__MODULE__) 
    end 
end 

wolę plan 2. Ponieważ w większości sytuacje, mogę umieścić całą logikę na temat pobierania danych w Modelu.

Ale znajdę oficjalny podręcznik użytkowania Plan 1 (docs/model) i Phoenix domyślny kod alias Repo w kontrolerze zamiast Modelu (web/web.ex)

Który z nich jest lepszy? I dlaczego?

Odpowiedz

16

Powinieneś utrzymywać swoje wywołania Repo wewnątrz kontrolera. Jeśli twoja logika jest skomplikowana, powinieneś rozważyć przeniesienie logiki do własnego modułu serwisowego.

Powinieneś traktować funkcje swojego modelu jako czyste (bez efektów ubocznych), aby działały tylko na danych. Tak na przykład można mieć:

def alphabetical(query) 
    order_by(query, [u], u.name) 
end 

Ale nie powinien mieć:

def alphabetical(query) 
    order_by(query, [u], u.name) 
    |> Repo.all 
end 

To dlatego, że zapytania są wyłącznie dane, wywołanie Repo.all ma skutki uboczne (schodzili do bazy danych), tak należy do kontrolera.

+0

Witam, mam kolejne pytanie dotyczące tego problemu. Jeśli umieszczę wywołania Repo w kontrolerze, jak przetestować model? Podobnie jak w przypadku twojego przykładu, czy powinienem użyć opcji Repo do wstawienia niektórych rekordów, a następnie wykonać test (wydaje się to być testowaniem integracyjnym) lub po prostu przetestować wynik 'order_by'? btw, nie mam pojęcia, jak przetestować wynik 'order_by'. –

+1

Programując Phoenix, zalecamy programistom posiadanie dwóch plików testowych w testach/modelach: user_test.exs i user_repo_test.exs. W pierwszej można przetestować zestawy zmian i wszystko, co nie wymaga repozytorium. Zaletą jest to, że możesz uruchomić z "async: true" na górze. Drugi wymaga repozytorium i może być miejscem do testowania złożonych zapytań. Wszystko zależy od rodzaju testu, który chcesz napisać. –

Powiązane problemy