2016-05-24 10 views
23

Vorrei esprimere la dimensione dell'elenco. Attualmente lo faccio come segue:asserire la dimensione dell'elenco in elisir

assert devices = Repo.all from d in device, where d.uuid == ^attrs.uuid 
assert devices.first == devices.last 

C'è un modo migliore per farlo?

risposta

32

Kernel.length/1 restituirà la dimensione di una lista:

length([1,2,3]) #3 

Si può fare questo da una query Ecto utilizzando:

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

In Ecto 2 È possibile utilizzare Repo.aggregate/4

query = from d in Device, where: d.uuid == ^uuid) 
assert Repo.aggregate(query, :count, :id) == 3 
+2

c'è qualche differenza/beneficio dall'usare Enum, count o Kernel.length? –

+3

Usano la stessa identica funzione 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 - si salta una corrispondenza di modello quando si usa la lunghezza. Aggiornerò la risposta per usare invece la lunghezza. – Gazler

+0

Ottimo! grazie per quello – Nomad