2017-06-27 4 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"]が偽である場合、コードは機能しません。偽であれば、studiosnilの値を得ます。

あなたはこのように、よりエレガントにこれを行うことができます:あなたはのparams上reduceすることで、より複雑なクエリを構築することができ

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

ifが同様に単一の行にすることが可能で

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

例えば、アドレスが条件付きで含まれることを可能にする:

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 
関連する問題