片段重用
Fragments reuse
是否有可能重用 fragments?
在这样的例子中
def unpublished_by_title(title) do
from p in Post,
where: is_nil(p.published_at) and
fragment("downcase(?)", p.title) == ^title
end
如果能把fragment-part提取到一个单独的函数中,这样就可以在其他地方重用,好像会很方便,例如:
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
记住你需要在使用宏之前定义它。
是否有可能重用 fragments?
在这样的例子中
def unpublished_by_title(title) do
from p in Post,
where: is_nil(p.published_at) and
fragment("downcase(?)", p.title) == ^title
end
如果能把fragment-part提取到一个单独的函数中,这样就可以在其他地方重用,好像会很方便,例如:
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
记住你需要在使用宏之前定义它。