2015-12-13 3 views
5

Возможно ли повторное использование fragments?Повторное использование фрагментов

В примере, как этот

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

Похоже, что это было бы очень удобно, чтобы иметь возможность извлечь фрагмент-часть в отдельную функцию, так что он может быть повторно использован в других местах, например:

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

def downcase(title) do 
    fragment("downcase(?)", ^title) 
end 

Однако, попробовав много разных вариантов, похоже, что это не сработало бы из-за расширений макросов или что-то в этом роде. Есть идеи?

ответ

5

Вы правы, запросы составлены во время компиляции. Из-за этого, если вы хотите расширить синтаксис запроса, вам нужно определить макросы вместо обычных функций.

Что-то вроде следующего должен сделать трюк:

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

Помните, что вы должны определить макрос, прежде чем использовать его.

+0

Привет, спасибо за предложение. К сожалению, я пробовал это, и это не сработало, я написал о возможной причине в части обновления вопроса. – ave

+2

@ave отлично работает для меня. Вы убедились, что макрос определен _above_ функцией, которая его использует? –