Добавление виртуального поля к объекту

  def list_links_count do

    query = 
      from l in Link,
        join: c in Click, as: :click,
        where: c.link_id == l.id,
        group_by: l.id,
        select: {l, count(l.id)}

    query |> Repo.all

  end

У меня есть функция, которая подсчитывает количество кликов на ссылку. Проблема в окончательной структуре данных, которая имеет вид {Link, 10}, То, что я действительно хотел бы сделать, это поместить это в общее число, чтобы я мог получить к нему более легкий вид, что-то вроде link.click_count, Это возможно?

2 ответа

Решение

Есть ли у вас виртуальное поле в вашей схеме Ecto для Link? Если нет, вы захотите добавить его:

field(:click_count, :integer, virtual: true)

Тогда ваш выбор может выглядеть примерно так:

select: %{l | click_count: count(l.id)}

Так как теперь у вас есть click_count введите ваш Link структуры, вы можете поставить этот ключ и по-прежнему иметь список Links, Таким образом, вы должны иметь возможность доступа link.click_count,

Использование Kernel.elem/2:

{Link, 10} |> elem(1) 
#⇒ 10

Итак, в вашем коде:

query
|> Repo.all()
|> how_do_you_get_tuple()
|> elem(1)
Другие вопросы по тегам