2015-12-13 30 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は完璧に動作します。マクロがそれを使用する関数の上に定義されていることを確認しましたか? –