2016-06-12 48 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