在elixir中断言列表的大小

alm*_*man 35 elixir

我想断言列表的大小.目前我这样做如下:

assert devices = Repo.all from d in device, where d.uuid == ^attrs.uuid
assert devices.first == devices.last
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

Gaz*_*ler 50

Kernel.length/1将返回列表的大小:

length([1,2,3]) #3
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令从Ecto查询执行此操作:

query = from d in Device, where: d.uuid == ^uuid, select: fragment("count(?)", d.id)
assert  Repo.all(query)== 3
Run Code Online (Sandbox Code Playgroud)

在Ecto 2中,您可以使用Repo.aggregate/4

query = from d in Device, where: d.uuid == ^uuid)
assert Repo.aggregate(query, :count, :id) == 3
Run Code Online (Sandbox Code Playgroud)

  • 使用Enum,count或Kernel.length有什么区别/好处吗? (3认同)
  • 他们使用完全相同的函数https://github.com/elixir-lang/elixir/blob/v1.2.5/lib/elixir/lib/kernel.ex#L453 https://github.com/elixir-lang/elixir /blob/v1.2.5/lib/elixir/lib/enum.ex#L452 - 使用长度时跳过模式匹配.我将更新使用长度的答案. (3认同)
  • 我还建议做`assert [devide] = Repo.all(...)`如果你需要记录并想确保只有一个. (2认同)