2016-06-08 3 views
0

특정 열의 합계를 얻으려고합니다. 총 가격이 저장되는 주문 스키마 (전체 필드 포함)가 있습니다. 이제는 모든 주문의 총 가치를 합산하는 쿼리를 만들려고 노력하고 있습니다. 그러나 제대로 수행하고 있는지 확실하지 않습니다.Elixir/Phoenix 열의 합

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 %>처럼 전화 : 여기 내가 지금까지있는 것입니다. 현재로서는 오류를 반환하지 않으며 총 수익 대신 페이지에 임의의 기호를 렌더링합니다.

내 쿼리가 잘못되었지만 올바르게 작동하는 방법에 대한 좋은 정보를 찾을 수 없다고 생각합니다. 어떤 도움을 주셔서 감사합니다, 감사합니다!

+0

사용중인 Ecto 버전은 무엇입니까? – Gazler

+1

'Repo.all' 대신'Repo.one'을 시도하십시오. – Dogbert

+0

@Dogbert 젠장, 내가이 실수를했다고 믿을 수 없어, 고마워! – Ilya

답변

4

쿼리는 단 하나의 값만 반환하고 Repo.all은 목록에 래핑합니다. <%= ... %>을 사용하여 목록을 인쇄하면 목록의 정수가 유니 코드 코드 포인트로 취급되므로 코드 포인트가있는 문자를 페이지의 출력으로 가져옵니다. 이 문제는 대신 Repo.one을 사용하여 값을 직접 반환합니다.이 경우에는 정수입니다.

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

오, 그래서 나는 값 대신 다른 기호를 얻고 있습니다. 정교에 감사드립니다! – Ilya

2

@ 도버트의 대답이 정확합니다. Ecto 2.0 (현재 출시 후보자 인 경우)을 사용하는 경우 Repo.aggregate/4 :

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