2015-12-13 24 views
5

Ist es irgendwie möglich, fragments wieder zu verwenden?Fragmente wiederverwenden

In einem Beispiel wie diese

def unpublished_by_title(title) do 
    from p in Post, 
    where: is_nil(p.published_at) and 
      fragment("downcase(?)", p.title) == ^title 
end 

Es scheint, wie es sehr bequem wäre in der Lage sein fragment Teil in eine separate Funktion zu extrahieren, so dass es in anderen Orten wiederverwendet werden können, zum Beispiel:

jedoch, nach dem Versuch, viele verschiedene Variationen scheint es wie dies würde nicht funktionieren wegen Makro-Erweiterungen oder so ähnlich. Irgendwelche Ideen?

Antwort

5

Sie haben Recht, Abfragen werden zur Kompilierzeit zusammengestellt. Aus diesem Grund müssen Sie Makros anstelle von regulären Funktionen definieren, wenn Sie die Abfragesyntax erweitern möchten.

etwas wie das folgende sollte es tun:

defmacro downcase(field) do 
    quote do 
    fragment("downcase(?)", unquote(field)) 
    end 
end 

Denken Sie daran, Sie Makro definieren müssen, bevor Sie es verwenden.

+0

Hallo, danke für den Vorschlag. Leider habe ich es versucht und es hat nicht geklappt, ich habe über einen möglichen Grund im Update Teil der Frage geschrieben. – ave

+2

@ave funktioniert perfekt für mich. Haben Sie sichergestellt, dass das Makro vor der Funktion definiert ist, die es verwendet? –