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
是否需要固定在这里,但我认为是)
看看下面的 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
是否需要固定在这里,但我认为是)