2016-12-02 59 views
0

我正在創建一個支出日記,因此在我看來需要一個交叉表。該應用程序有一個支出表。該表中的每條記錄都是一個單獨的支出,其中包括「價值」(整數),「日」(如日期)和「Category_ID」(如整數和外鍵)。Rails:在交叉表中顯示數據

我想要做的是顯示一張表格,顯示一個用戶每個月在每個類別上花了多少錢。

因此我需要做兩兩件事:按月份和類別

  1. 集團所有支出
  2. 顯示,在視圖

在我想從去其他條款:

enter image description here

要:

enter image description here

我怎樣才能做到這一點?一直在尋找一段時間,但沒有找到合適的解決方案。

此外,我想顯示不是「Category_ID」,但類別的名稱(從類別連接表)。

更新: 我試過到目前爲止以下:

@expenditures = Expenditure.where(:user_id => current_user) 
@grouped_exp = @expenditures.includes(:category).group("DATE_TRUNC('month', day)", :name).sum(:value) 

現在給我:

[[[2016-08-01 00:00:00 UTC, "housing | electricity"], -31.0], [[2016-09-01 00:00:00 UTC, "other | pharmacy & drugstore"], -9.5], [[2016-08-01 00:00:00 UTC, "financials | salary"], 2913.92], [[2016-10-01 00:00:00 UTC, "housing | internet"], -26.06], ... ] 

所以我現在已經爲每個類別在每個月的總和。但是,我不知道這是否是正確的方法,如果是的話,接下來的步驟是什麼。

+0

我在我的崗位增加了一個更新記錄。 – Oliver

回答

1

要創建的表不能這樣做。它似乎有一個對應於一年中幾個月的動態列。這不能使用ActiveRecord完成。您必須直接使用SQL,並以編程方式生成查詢,並始終爲每列選擇特定的日期範圍。可能不是一個好主意,除非你是一些SQL英雄。

你需要的是更多的東西像這樣

Category.joins(:expenditures). 
    where("expenditures.user_id = ?", current_user). 
    group("categories.id, DATE_TRUNC('month', day)"). 
    select("categories.name, DATE_TRUNC('month', day) AS month, SUM(value) AS sum") 

,這將給你喜歡

r = records.first 
r.name => 'Some category' 
r.month => '2016-10' 
r.sum => 55 
0

你可以嘗試這樣的事:

@expenditures 
    .joins(:category) 
    .select('DATE_TRUNC('month', day) as day, category_id, sum(value) as total') 
    .group('day, category_id, total') 
+0

好吧,試了一下。如果我在我的視圖中執行<%= @grouped_exp%>,我會得到:# Oliver

+0

如果我執行了<%= @ grouped_exp.to_a%>,則得到:PG :: GroupingError:ERROR:column「開發人員必須在GROUP BY子句中出現或在集合函數中使用 LINE 1:SELECT DATE_TRUNC('month',day)as day,category_id,sum(val ... – Oliver

+0

然後查詢出了問題,在控制檯中運行它並嘗試獲取第一個值。您將看到執行的SQL查詢以及錯誤 –