片段重用

时间:2015-12-13 08:36:28

标签: elixir ecto

是否有可能重用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
然而,在尝试了许多不同的变化之后,由于宏扩展或类似的东西,这似乎不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

你是对的,查询是在编译时编写的。因此,如果要扩展查询语法,则需要定义宏而不是常规函数。

以下内容应该可以解决问题:

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

请记住,在使用之前需要先定义宏。