2016-06-12 51 views
0

我已经在我的分贝以下表格:药剂/凤凰查询含量

schema "foods" do 
field :name, :string 
has_many :order_items, MyApp.OrderItem 
end 

schema "order_items" do 
field :quantity, :integer, default: 1 
field :price, :integer 
belongs_to :food, MyApp.Food 

订单项目保持food_id,以及数量。现在我试图创建一个查询,显示每个食品的订购量。这是我到目前为止有:

fooditems = Repo.all(from p in OrderItem, join: f in Food, on: p.food_id == f.id, 
        group_by: f.name, select: {f.name, count(p.id)}, order_by: count(p.id)) 

基本上,我有两个问题:1)如何让数量字段(从订单项目表),也包括在查询算?例如,如果订购商品的数量是2,则count()只会计数为1,那么如何使count()不仅通过id来计数,还包括数量(来自订单商品表,数量字段)?

此外,我不知道如何从HTML调用查询。我试过

  <%= for item <- @fooditems do %> 
       <tr> 
       <td><%= item.name %></td> 
       </tr> 
      <% end %> 

但它返回参数错误,所以我相信,我只是用item.name调用它错误的方式。一般来说,我想要一个表格来列出食物名称和相应的数量(来自order_item表,包括数量字段)。

感谢

回答

2

当你正在做的食品的name一个GROUP_BY,我猜你想要数量的总和。这是我会怎么做:

Repo.all(from p in OrderItem, 
      join: f in Food, 
      on: p.food_id == f.id, 
      group_by: f.name, 
      select: %{name: f.name, count: count(p.id), quantity: sum(p.quantity)}, 
      order_by: count(p.id)) 

这会产生以下查询:

选择F1 “名称”,计数(O0 “ID”),和(O0 “量”。) FROM “ORDER_ITEMS” AS O0 INNER JOIN “食品” 为F1 ON O0。 “food_id”= F1。 “ID” GROUP BY F1。 “名” ORDER BY计数(O0。 “ID”)

对于第二部分,Repo.all返回您的查询的select部分中的任何内容的列表,在您的情况下它是一个元组,而不是一张地图,但你试图像Map一样访问它。

为了您的原始查询,这将工作:

<%= for {food_name, count} <- @fooditems do %> 

对于查询我上面写的,它返回一个地图,你可以很容易地访问字段:

<%= for item <- @fooditems do %> 
    <tr> 
    <td><%= item.name %></td> 
    <td><%= item.count %></td> 
    <td><%= item.quantity %></td> 
    </tr> 
<% end %> 
+0

谢谢Dogbert!所以,我应该使用sum()来计算数量,而不是count。至于元组,我明白我做错了什么,我会按照你的建议和使用地图来代替! – Ilya

+0

是的,'count'会返回订单的数量,而'sum(数量)'会将这些订单的所有数量相加。 – Dogbert