Elixir / Phoenix总和列

时间:2016-06-08 08:51:19

标签: elixir phoenix-framework elixir-framework

我试图得到特定列的总和。 我有一个订单模式,字段总数,存储总价格。 现在我尝试创建一个查询,将所有订单的总价值相加,但不确定我是否做得对。 以下是我到目前为止的情况:

def create(conn, %{"statistic" => %{"date_from" => %{"day" => day_from, "month" => month_from, "year" => year_from}}}) do

date_from = Ecto.DateTime.cast!({{year_from, month_from, day_from}, {0, 0, 0, 0}})
revenue = Repo.all(from p in Order, where: p.inserted_at >= ^date_from, select: sum(p.total))

render(conn, "result.html", revenue: revenue)
end

只需在html.eex中调用<%= @revenue %>即可。 截至目前,它不会返回错误,只是在页面上呈现随机符号,而不是总收入。

我认为我的查询错误,但无法找到有关如何使其正常工作的良好信息。感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:5)

您的查询只返回1个值,Repo.all将其包装在列表中。当您使用<%= ... %>打印列表时,它会将列表中的整数视为Unicode代码点,并且您将获得带有该代码点的字符作为页面上的输出。修复方法是使用Repo.one代替,它将直接返回值,在本例中为整数。

revenue = Repo.one(from p in Order, where: p.inserted_at >= ^date_from, select: sum(p.total))

答案 1 :(得分:3)

@ Dogbert的回答是正确的。值得注意的是,如果您使用的是Ecto 2.0(目前处于候选版本),那么您可以使用Repo.aggregate/4

revenue = Repo.aggregate(from p in Order, where: p.inserted_at >= ^date_from, :sum, :total)