是否有可能重用碎片?
在这样的例子中
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
然而,在尝试了许多不同的变化之后,由于宏扩展或类似的东西,它似乎不起作用.有任何想法吗?
你是对的,查询是在编译时编写的.因此,如果要扩展查询语法,则需要定义宏而不是常规函数.
像下面这样的东西应该做的伎俩:
defmacro downcase(field) do quote do fragment("downcase(?)", unquote(field)) end end
请记住,在使用之前需要定义宏.