如何在Phoenix / Ecto中汇总has_many字段?

时间:2019-02-05 11:19:04

标签: phoenix-framework ecto

例如,我有以下关系:

Posts has_many Comments

我正在尝试执行以下操作:

Post |> Repo.aggregate(:count, :comments)

但是,Ecto抱怨:comments是一个虚拟字段,因此无法对其进行计数。解决此问题的好方法是什么?

2 个答案:

答案 0 :(得分:0)

我假设您希望对一组帖子的评论计数。如果您希望所有帖子的评论计数都可以忽略where子句。

post_ids = [1, 2, 3]
Comment
|> where([c], c.post_id in ^post_ids)
|> group_by([c], c.post_id)
|> select([c], {c.post_id, count("*")})
|> Repo.all()

在给定post_id的情况下,这将按帖子将评论分组,并计算每个评论有多少。它将返回一个包含元组的列表,例如像这样

[
  {1, 10},
  {2, 3},
  {3, 5}
]

如果帖子没有评论,则不会在结果集中列出。

答案 1 :(得分:0)

这是我的最终解决方案,其中link has_many clicks

  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