管道操作员不工作

1 elixir ecto

这很好用:

a1 = Repo.get_by(MyModel, var1: var1)   
a2 = Repo.preload(a1, [:aaa, bbb: :ccc]).items   
Run Code Online (Sandbox Code Playgroud)

但这引发了一个例外:

Repo.get_by(MyModel, var1: var1) |> Repo.preload([:aaa, bbb: :ccc]).items

# or this
# a2 = Repo.get_by(MyModel, var1: var1) |> Repo.preload([:aaa, bbb: :ccc]).items
Run Code Online (Sandbox Code Playgroud)

存在:

** (UndefinedFunctionError) function MyApp.Repo.preload/1 is undefined or private. Did you mean one of:

      * preload/2
      * preload/3
Run Code Online (Sandbox Code Playgroud)

怎么了?

Dog*_*ert 6

您的代码目前解析为:

Repo.get_by(MyModel, var1: var1) |> (Repo.preload([:aaa, bbb: :ccc]).items)
Run Code Online (Sandbox Code Playgroud)

也就是说,首先Repo.preload用1参数调用,然后items提取其字段,然后管道发生,这不起作用.

您可以通过将管道包装在括号中来解决此问题:

(Repo.get_by(MyModel, var1: var1) |> Repo.preload([:aaa, bbb: :ccc])).items
Run Code Online (Sandbox Code Playgroud)

或使用Map.getMap.fetch!提取items密钥:

Repo.get_by(MyModel, var1: var1) |> Repo.preload([:aaa, bbb: :ccc]) |> Map.fetch!(:items)
Run Code Online (Sandbox Code Playgroud)