2016-12-02 64 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查询以及错误 –