2015-04-11 16 views
7

Podobnie jak inne funkcje w eliksiru (jak również własne transakcje Ecto), chcę dopasować wzorce do obsługi potencjalnych błędów za pomocą zapytań Ecto. Tak:Jak dopasować wzór Ecto błąd zapytania

case Repo.get!(User, id) do 
    {:ok, user} -> 
    #do something 
    {:error, message} -> 
    #pass the error 
end 

Oczywiście to nie działa, ale jak mogę wzór błędy mecz ekto jak Ecto.NotSingleResult i innych potencjalnych problemów, takich jak zapytania błędów wstępnego obciążenia?

Odpowiedz

2

Używaj Repo.get która będzie zwracać wartość lub zerowa. Następnie możesz dopasować wzorce do oczekiwanej struktury lub użyć klauzul if. Repo.get! podnosi celowo (w przypadkach, w których oczekuje się, że struktura będzie tam, a nie będzie tam, wystąpił błąd).

+2

Tak, jak to teraz robię, po prostu zastanawiałem się, dlaczego Ecto nie zwrócił krotki, jak wiele innych rzeczy. Odpowiedź tupot to naprawdę dobry sposób na poradzenie sobie z błędami i przepływem. –

+0

Eliksir rzeczywiście ma oba. Zwykle używamy krotki, gdy istnieją różne powody błędu (jak w funkcjach modułu Pliku). Tutaj jednak jedynym powodem błędu jest brak wartości, która jest właściwie wyrażona zerem. –

+0

Dodatkowym powodem błędu w zapytaniach Eo jest, gdy funkcja oczekuje najwyżej jednego wyniku, ale zamiast tego wiele wyników jest wyodrębnianych przez zapytanie. Mamy więc dwa różne powody błędu i dwa różne sposoby radzenia sobie z nimi: zero, gdy nie otrzymujemy żadnego wyniku, i wyjątek, gdy otrzymujemy wiele wyników. Z krotkami łatwo i elegancko radzi sobie z tymi przypadkami, ponieważ możemy użyć instrukcji "case" lub "with", szczególnie gdy wiele zapytań Ecto jest połączonych ze sobą. – Guido

0

Hej Jestem trochę nowych do eliksiru, ale myślę, że można użyć klauzuli straży tutaj

case Repo.get!(User, id) do 
    {:ok, user} -> 
    #do something 
    {:error, message} when :error === Ecto.NotSingleResult -> 
    #pass the error 
end 
+0

Problem polega na tym, że Ecto.Repo.whatever nie zwraca krotki jak {: OK, OK} lub {: błędem, błąd} i nie pasuje do żadnej z tych klauzul. Mam go teraz w prywatnej funkcji zasadniczo robiąc '[Repo.get()] |> List.count()' i pasujące zero do: błąd i 1 do: ok, ale myślałem, że może być n łatwiejszy sposób. –