2017-06-27 82 views
0

我在鳳凰的應用程序控制器下列行動:鳳凰控制器動作重構

defmodule TattooBackend.Web.API.V1.StudioController do 
    use TattooBackend.Web, :controller 

    alias TattooBackend.Repo 
    alias TattooBackend.Accounts.Account 

    def index(conn, params) do 
    studios = Studio 

    studios = if params["search"] do 
     Studio.search(studios, params["search"]) 
    end 

    studios = studios |> Repo.all |> Repo.preload(:address) 

    render conn, studios: studios 
    end 
end 

有什麼辦法來重構這段代碼是更具可讀性?

+1

當'params'沒有''search''時,它甚至可以正常工作嗎?就我所知,「工作室」在這種情況下將成爲「無」。 – Dogbert

回答

2

params["search"]是虛假的,您的代碼將無法使用。如果它是虛假的,studios將得到值nil

你可以更優雅做到這一點是這樣的:

studios = 
    if params["search"] do 
    Studio.search(Studio, params["search"]) 
    else 
    Studio 
    end 
    |> Repo.all 
    |> Repo.preload(:address) 

if可以摺疊成一個單一的產品,以及:

studios = 
    if(params["search"], do: Studio.search(Studio, params["search"]), else: Studio) 
    |> Repo.all 
    |> Repo.preload(:address) 
1

您可以通過reduce在PARAMS構建更復雜的查詢例如允許地址有條件地包括:

query = 
    Enum.reduce(params, Studio, fn 
    {"search", search_term}, query -> Studio.search(query, search_term) 
    {"include_address", "true"}, query -> Ecto.Query.preload(query, :address) 
    # ... additional query building params handled here 
    _, query -> query # ignore unrecognised params 
    end) 

studios = Repo.all(query) 
render conn, studios: studios