Elixir 管道链应以原始值开始

Elixir 管道链应以原始值开始,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我在Phoenix应用程序控制器中执行以下操作: def index(conn, params) do studios = if params["search"] do Studio.search(Studio, params["search"]) else Studio end |> Repo.all |> Repo.preload(:address) render c

我在Phoenix应用程序控制器中执行以下操作:

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

    render conn, studios: studios
  end
当我的跑步
mix credo
时,它返回以下警告:

┃ [F] → Pipe chain should start with a raw value.
┃       lib/tattoo_backend/web/controllers/api/v1/studio_controller.ex:21 #(TattooBackend.Web.API.V1.StudioController.index)
我曾试图重构它,但我没有找到让credo满意的解决方案。有什么办法解决这个问题吗

if foo do
  bar
else
  baz
end
相当于if(foo,do:bar,else:baz)。一旦知道这一点,您就可以理解错误消息的含义:
params[“search”]
应该通过管道传输到
if
。这将修复警告:

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

  render conn, studios: studios
end

使用模式匹配:

def index(conn, params) do
  params
  |> search
  |> Repo.all()
  |> Repo.preload(:address)
end

defp search(%{"search" => search}) do
  Studio.search(Studio, search)
end
defp search(_), do: Studio

怎么样:
params |>to_query()|>Repo.all()|>…
,并且有两个
def to_query({“search”=>search})的定义,do:…
def to_query(_params),do:Studio
?我将使用这一个,但有一点小小的改进:将
params[“search”
更改为
search
,因为你已经通过模式匹配得到了它。否则,您将收到一条警告,提示未使用
搜索
变量。
def index(conn, params) do
  params
  |> search
  |> Repo.all()
  |> Repo.preload(:address)
end

defp search(%{"search" => search}) do
  Studio.search(Studio, search)
end
defp search(_), do: Studio