Я столкнулся со странной проблемой с компилятором - он утверждает, что мой макрос не используется, несмотря на то, что я вызываю его в том же модуле. Возможно, это как-то связано с его использованием в операторе where, но в конце концов, я думаю, это не должно быть проблемой. Есть идеи, ребята? ;)
defmodule Module do
defmacrop coalesce(left, right) do
quote do
fragment("COALESCE(?, ?)", unquote(left), unquote(right))
end
end
def remove(timestamp \\ Timex.now) do
Schema
|> where([p], coalesce(p.time, ^timestamp) < ^timestamp)
|> Repo.delete_all(returning: select_all(Schema))
end
end
Дело в том, что я потратил много времени на Ecto 2.0 и проблема появилась после обновления;)
Это потому, что вы не используете макрос, который вы определили. Вы используете Ecto.Query.API.coalesce
Ха! Хороший улов :) Я действительно импортирую сюда Ecto.Query
, но не вставлял. Спасибо.
По моему опыту, пока вы хорошо не знаете язык, вы всегда должны называть свои переменные / функции ведущими
my
. Это предотвращает головные боли, как вы страдали.