有没有办法在 Ecto 查询中将属性列表迭代到 select?

Is there a way to iterate over a list of attributes to select in an Ecto query?

所以,我有一个查询,我正在尝试构建其中有一个列表 attributes,它是 table 上的列。此查询是按属性列表、计数和 return 计数与属性列表进行分组。最后一部分是我难以实现的。现在我有

defmodule ProjectName.Counter do
  import Ecto.Query, only: [group_by: 3, select: 3]

  def group_and_count(queryable, groups) do
    queryable
    |> group_by([q], ^groups)
    |> select([q], count(q.id))
  end
end

我在上下文中这样调用的

Track
|> Counter.group_and_count([:album, :artist])
|> Repo.all()

哪个 return 是我 [1, 5, 4, 2] 是正确的,但不是我想要的 return。我想实际查询

SELECT COUNT(*), tracks.album, tracks.artist FROM tracks GROUP BY tracks.album, tracks.artist

这会 return

[[1, "Calypso", "Harry Belafonte"],
 [5, "Silk & Soul", "Nina Simone"],
 [4, "Hello, Dolly!", "Louis Armstrong"],
 [2, "Pure Gold", "Perry Como"]]

我怎样才能更改我的代码以使其工作?我想不出在 select 查询中迭代 groups 的方法。

可能有更好的方法,但看起来 map/2 and struct/2 是为了支持传入列表。

它很难看,但您可以 select 一个包含地图和计数的元组:

|> select([q], {map(q, ^groups), count(q.id)})