У меня есть следующие запросы, и, как видно, требуется довольно много копирования/вставки.Очистка повторяющегося кода с помощью макросов?
Есть ли быстрый и элегантный способ решить это с помощью метапрограмм?
def by_day_of_week(query \\ Conversation) do
from c in query,
select: %{
monday: fragment("count(extract(dow FROM ?) = 0 OR null)", c.inserted_at),
tuesday: fragment("count(extract(dow FROM ?) = 1 OR null)", c.inserted_at),
wednesday: fragment("count(extract(dow FROM ?) = 2 OR null)", c.inserted_at),
thursday: fragment("count(extract(dow FROM ?) = 3 OR null)", c.inserted_at),
friday: fragment("count(extract(dow FROM ?) = 4 OR null)", c.inserted_at),
saturday: fragment("count(extract(dow FROM ?) = 5 OR null)", c.inserted_at),
sunday: fragment("count(extract(dow FROM ?) = 6 OR null)", c.inserted_at),
}
end
def by_time_of_day(query \\ Conversation) do
from c in query,
select: %{
"00" => fragment("count(extract(h FROM ?) = 0 OR null)", c.inserted_at),
"01" => fragment("count(extract(h FROM ?) = 1 OR null)", c.inserted_at),
"02" => fragment("count(extract(h FROM ?) = 2 OR null)", c.inserted_at),
"03" => fragment("count(extract(h FROM ?) = 3 OR null)", c.inserted_at),
"04" => fragment("count(extract(h FROM ?) = 4 OR null)", c.inserted_at),
"05" => fragment("count(extract(h FROM ?) = 5 OR null)", c.inserted_at),
"06" => fragment("count(extract(h FROM ?) = 6 OR null)", c.inserted_at),
"07" => fragment("count(extract(h FROM ?) = 7 OR null)", c.inserted_at),
"08" => fragment("count(extract(h FROM ?) = 8 OR null)", c.inserted_at),
"09" => fragment("count(extract(h FROM ?) = 9 OR null)", c.inserted_at),
"10" => fragment("count(extract(h FROM ?) = 10 OR null)", c.inserted_at),
"11" => fragment("count(extract(h FROM ?) = 11 OR null)", c.inserted_at),
"12" => fragment("count(extract(h FROM ?) = 12 OR null)", c.inserted_at),
}
end
Какие у вас были попытки приблизиться к этой проблеме? Не могли бы вы поделиться ими вместе с проблемами, с которыми вы столкнулись? –
Вы пробовали создать эту карту с другой функцией? Я думаю, вы должны быть способны решить эту проблему без макросов, но если вы настаиваете на их использовании, вы можете это сделать. $ {} - это просто функция. Введите цитату iex do% {whatever} – Haito
Метод «фрагмент» недоступен за пределами 'from' – Tarlen