2016-11-08 15 views
15

W Elixir, operator szpilki służy do zapobiegania ponownemu wiązaniu. Jednakże w odniesieniu do zapytania ekto jakDlaczego operatory pinów są niezbędne w zapytaniach Ecto?

from u in User, where: u.username == ^username 

autorów Programowanie Phoenix państwa (w rozdziale 7), które

Pamiętaj, że^operatora (tzw operator pin) oznacza chcemy zachować ^nazwa użytkownika to samo.

Ale to nie brzmi dobrze, ponieważ podobno porównanie w zapytaniu nie powoduje żadnego ponownego wiązania zmiennych.

Czy autorzy książki (której José Valim jest współautorem) się pomylili? Czy operator pinów w Ecto pyta jedynie o konstrukcję DSL Ecto zamiast zwykłego operatora szpilki Elixir? A może zapytanie naprawdę zyska szansę na ponowne powiązanie username po rozwinięciu makr?

Odpowiedz

0

Operator pin^powinien być stosowany, gdy chcemy wzór mecz z wartością istniejącą zmienną, a nie ponownego wiązania zmiennej:

Czytaj więcej na: http://elixir-lang.org/getting-started/pattern-matching.html

wartości zewnętrzne i wyrażenia Elixir można wstrzykiwać do wyrażenie zapytanie o ^: bardziej na: https://hexdocs.pm/ecto/Ecto.Query.html

+2

Jaki jest sens pierwszego zdania w tym kontekście? Że zapytania Ecto są w rzeczywistości dopasowanymi wzorcami? –

12

Według Ecto documentation operator w ekto stykowe jest stosowane do interpolacji zapytań:

wartości zewnętrzne i wyrażenia eliksiru może być wstrzykiwany w wyrażeniu kwerendy z^

def with_minimum(age, height_ft) do 
    from u in "users", 
    where: u.age > ^age and u.height > ^(height_ft * 3.28), 
    select: u.name 
end 

Próbując ominąć pin daje błąd jak Ecto cann't dowiedzieć funkcję bazy danych lub zapytanie wyrażenie nazwie age:

(Ecto.Query.CompileError) zmienna age nie jest poprawnym zapytania wypowiedzi. Zmienne muszą być wyraźnie interpolowane w zapytaniach z^

16

zapytań ekto za polegać na makr, aby zapewnić mocny DSL że używamy. Oznacza to, że cokolwiek stanie się po from, nie jest "zwykłym" kodem Eliksiru, ale DSL, który ostatecznie zostanie przekształcony w zapytanie SQL. Tak więc karetka nie jest operatorem pinezki jako takim i nie ma nic wspólnego z dopasowywaniem wzorca (chociaż oczywiście nadal można go nazwać "operatorem pinów", ponieważ ludzie zawsze zapominają słów takich, jak iii gwiazdka). Jest to wygodny operator, który autorzy Ecto wybierają jako "operatora interpolacji". Bez niego, username z twojego przykładu zostanie wzięty dosłownie i wstawiony bezpośrednio do wygenerowanego SQL (chociaż Ecto jest wystarczająco inteligentny, aby zobaczyć, że to nie jest to czego chcesz, więc rozlewa błąd).

Świetne pytanie BTW, zainspirowało mnie do przeczytania więcej o makrach (newbie w FP tutaj).