Elixir 中的评估输入参数(使用 Ecto)

Eval-ing paramaters in Elixir (with Ecto)

看看下面的 select() 行:

def query_group(user, group_by, filters \[]) do
    from(Click)
    |> select([c], {c.^group_by, count(c)})
    |> where([c], c.link_user_id == ^user.id)
    |> where([c], ^filters)
    |> group_by([c], ^group_by)
    |> Repo.all
    |> Enum.map(&(Tuple.to_list &1))
  end

group_by 是一个原子。例如,如果group_by = :platform,那么在select字段中,我需要得到select([c], {c.platform, count(c)}).

解决这个问题的最佳方法是什么?

您可以为此使用 fragments,将 select 位更改为

...
|> select(fragment("count(*), ?", ^group_by))

这样就可以方便的使用函数的输入了

您也可以使用 field/2,如 select([c], {field(c, ^group_by), count(1)}) (不确定 group_by 是否需要固定在这里,但我认为是)