Rails:在交叉表中显示数据
问题描述:
我正在创建一个支出日记,因此在我看来需要一个交叉表。该应用程序有一个支出表。该表中的每条记录都是一个单独的支出,其中包括“价值”(整数),“日”(如日期)和“Category_ID”(如整数和外键)。Rails:在交叉表中显示数据
我想要做的是显示一张表格,显示一个用户每个月在每个类别上花了多少钱。
因此我需要做两两件事:按月份和类别
- 集团所有支出
- 显示,在视图
在我想从去其他条款:
要:
我怎样才能做到这一点?一直在寻找一段时间,但没有找到合适的解决方案。
此外,我想显示不是“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], ... ]
所以我现在已经为每个类别在每个月的总和。但是,我不知道这是否是正确的方法,如果是的话,接下来的步骤是什么。
答
要创建的表不能这样做。它似乎有一个对应于一年中几个月的动态列。这不能使用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
答
你可以尝试这样的事:
@expenditures
.joins(:category)
.select('DATE_TRUNC('month', day) as day, category_id, sum(value) as total')
.group('day, category_id, total')
我在我的岗位增加了一个更新记录。 – Oliver