ruby-on-rails - Rails 运行总计专栏

标签 ruby-on-rails database postgresql cloud9-ide

在完成多个教程后,我目前正在处理我的第一个 Rails 项目。

我正在尝试构建一个网页来跟踪我 future 6 个月的储蓄目标。

该网站基本上由一个表单输入组成,我在其中输入我将钱存入储蓄的日期和金额。然后,该站点会更新折线图以显示当前节省量与目标线。

到目前为止,我已经成功构建了表单和数据库(使用 postgresql)并创建了显示目标并接受表单输入的图表。

我遇到的问题是输入值显示为离散数字,而不是当月的累计总和(即第 4 周应该是第 1 周到第 4 周节省的总和)。

我最初考虑在数据库中有一个名为 amount_cum 的第 3 列,并在 Controller 的页面加载方法中放置一些行,这意味着数据库将在每个页面加载时重新计算,这可能很慢......

如有任何建议,我将不胜感激,我应该修改模型还是 Controller ?

放上智慧的话

class PagesController < ApplicationController
def home
 @pages = Pages.new
 @progress = Pages.order(:week)
 @goal = Goals.all
end

def create
 @pages = Pages.new(pages_params)
 weeks_year=Date.parse(params[:pages][:week]).strftime("%U")

 @pages = Pages.new(pages_params.merge(:week => weeks_year))


if @pages.save
  flash[:success]="Savings Uploaded Successfully"
   redirect_to root_path
else
   flash[:danger]=@pages.errors.full_messages.join(", ")
   redirect_to root_path
 end
 end  
private
 def pages_params
 params.require(:pages).permit(:week, :amount)
end

end

和模型文件:

 class Pages < ActiveRecord::Base
  validates :week, presence: true
  validates :amount, presence: true
 end

我的 View 文件 - 我使用 chartkick gem 生成图表:

  <%= line_chart [
  {name: "Amount Saved", data: @progress.group(:week).sum(:amount)},
  {name: "Goal Savings", data: @goal.group(:week).sum(:amount) }] %>

应用程序的屏幕截图,您可以看到图表是如何根据目标显示的。 link

最佳答案

在这种情况下,您可以在生成图表时在 View 中使用inject:

<% saved = [] %>
<% @progress.inject(0) do |sum, page| %>
<%   current = sum + page.amount
<%   saved << current %>
<%   current # the return value is passed in as `sum` in the next iteration %>
<% end %>
<%= line_chart [
      {name: "Amount Saved", data: saved},
      {name: "Goal Savings", data: @goal.group(:week).sum(:amount) }]
%>

更短但有点笨拙:

<% saved = [] %>
<% @progress.inject(0) { |sum, page| (saved << sum + page.amount).last} %>
<%= line_chart [
      {name: "Amount Saved", data: saved},
      {name: "Goal Savings", data: @goal.group(:week).sum(:amount) }]
%>

您没有在 Goal 模型上发布任何信息,但如果您还希望绘制每周目标的增量增长图,则可以使用类似的技术。

编辑: 如果你需要一个数组数组,你可以尝试这样的事情(原谅我,我在我的手机上这样做)

<% @progress.inject(0) { |sum, page| (saved << [page.week, sum + page.amount]).last.last} %>

编辑 2: 我不认为 inject 应该修改原始的 @progress 数组(如果这是你要问的),但为了论证(和诊断),请尝试以下(我们当然可以漂亮这个如果可行的话就起来):

<% saved = [] %>
<% cum_sum = 0 %>

<% @progress.map do |page| %>
<%   cum_sum += page.amount %>
<%   saved << [page.week, cum_sum] %>
<% end %>
<%= line_chart [
      {name: "Amount Saved", data: saved},
      {name: "Goal Savings", data: @goal.group(:week).sum(:amount) }]
%>

关于ruby-on-rails - Rails 运行总计专栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41501477/

相关文章:

java - 未设置密码时如何连接 JDBC postgres 连接而无需密码

html - 有没有办法覆盖 CSS 的外层?

mysql - 如何从文件加载数据而不重复记录

ruby-on-rails - 按计数查询加快 Active Record 组

ruby-on-rails - ActiveRecord 与两个数据库对话?

node.js - 查询时间 mongoose 偶尔需要 3-4 秒

postgresql - 使用 PostgreSQL plpython3u 函数返回一个表

ruby-on-rails - 使用 Ruby on Rails 根据时间间隔发送电子邮件

ruby-on-rails - 如何将参数的默认反序列化覆盖到模型对象?

ruby-on-rails - 使用 pik 后,gem 列表不显示本地 gems