向对象添加虚拟字段

Adding a virtual field to an object

  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 的点击次数。问题在于最终的数据结构,其形式为 {Link, 10}。我真正想做的是让总数达到 put_in,这样我就可以在视图中更轻松地访问它,例如 link.click_count。这可能吗?

使用Kernel.elem/2:

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

因此,在您的代码中:

query
|> Repo.all()
|> how_do_you_get_tuple()
|> elem(1)

您的 Ecto 架构中是否有 Link 的虚拟字段?如果没有,您需要添加它:

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

那么你的 select 可能看起来像这样:

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

由于您现在在 Link 结构中有一个 click_count 键,您可以放置​​该键并且仍然有一个 Links 列表。所以你应该能够访问 link.click_count.