2017-01-06 6 views
1

Ich arbeite derzeit an meinem ersten Rails-Projekt nach der Arbeit durch mehrere Tutorials.Schienen laufen insgesamt Spalte

Ich versuche eine Webseite zu erstellen, um mein Sparziel für die nächsten 6 Monate zu verfolgen.

im Wesentlichen die Website besteht aus einem Formular-Eingabe, wo ich das Datum gebe ich Geld in Einsparungen und die Menge eingeben. Diese Website aktualisiert dann ein Liniendiagramm, um die aktuellen Einsparungen gegenüber der Ziellinie anzuzeigen.

Bisher habe ich das Formular und die Datenbank (mit postgresql) erfolgreich erstellt und das Diagramm erstellt, das das Ziel anzeigt und Eingabe aus dem Formular akzeptiert.

Das Problem, das ich habe, ist, dass die Eingabewerte als diskrete Zahlen und nicht eine kumulative Summe in diesem Monat angezeigt werden (d. H. Woche 4 sollte die Summe der Einsparungen aus den Wochen 1 bis 4 sein).

hielt ich zunächst eine dritte Spalte in der db genannt amount_cum mit und einige Linien in der Seitenladeverfahren in der Steuerung setzen, die die Datenbank bedeutet, bei jedem Laden der Seite neu zu berechnen würde, die langsam sein kann ...

Irgendwelche Ratschläge würden geschätzt werden, sollte ich schauen, um das Modell oder den Controller zu ändern?

Lay auf die weisen Worte

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][email protected]_messages.join(", ") 
    redirect_to root_path 
end 
end 
private 
def pages_params 
params.require(:pages).permit(:week, :amount) 
end 

end 

Und Modelldatei:

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

meiner Ansicht Datei - ich chartkick gem verwenden, um die Grafik zu erzeugen:

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

Screenshot von die Anwendung, damit Sie sehen können, wie der Graph gegen das Ziel angezeigt werden soll. link

+0

Es könnte einfacher sein zu helfen, wenn Sie einige Code-Schnipsel posten konnten – soupdog

+1

hinzugefügt - seien Sie einfach auf mich: P – timboon

+0

so brauchen Sie kumulative Summen von Monaten? –

Antwort

1

In diesem Fall könnten Sie inject in der Ansicht verwenden, wenn das Diagramm zu erzeugen:

<% 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) }] 
%> 

Shorter aber ein wenig umständlich:

<% 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) }] 
%> 

Sie keine Informationen veröffentlichen hat auf das Goal Modell, aber Sie könnten eine ähnliche Technik verwenden, wenn Sie auch die schrittweise Erhöhung des Ziels jede Woche grafisch darstellen möchten.

EDIT: Wenn Sie ein Array von Arrays benötigen, können Sie so etwas wie dies versuchen könnte (verzeihen Sie mir, ich das auf meinem Handy mache)

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

EDIT 2: Ich glaube nicht, inject sollte die ursprüngliche @progress Array ändern (wenn das, was Sie fragen), aber für die Zwecke der Beweisführung (und Diagnose), versuchen Sie die folgende (wir dies sicherlich recht können, wenn es funktioniert):

<% 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) }] 
%> 
+0

Probieren Sie einfach, dass - mit der Funktion line_chart in der Schleife erzeugt es ein neues Diagramm für jede Iteration (ich habe jetzt etwa 50 Grafiken auf meiner Seite). – timboon

+0

Es gibt auch eine Möglichkeit, dies mit benutzerdefiniertem SQL zu tun ('select'ing eine laufende Summe Spalte), aber ich bin mir nicht sicher, ob es klarer oder leistungsfähiger wäre. – soupdog

+0

Ich verstehe. Probieren Sie die neueste Version aus. – soupdog

0

Es gibt eine einfachere Art zu berechnen Summen in Rails - Sie müssen inject nicht verwenden, können Sie einfach sum auf dem Array von Datensätzen aufrufen.In Ihrem Fall wäre es so etwas wie:

@progress.sum(:amount) 

jedoch die Art, wie ich Ihre Frage auf der ersten Lese interpretiert, dachte ich, dass Sie eine Reihe von Teilsumme aus einer Reihe von tatsächlichen Summen zu schaffen versuchen. Ich weiß nicht, ob das für Sie von Nutzen ist, aber wie auch immer, hier ist, wie ich tun würde, dass die Verwendung von Ruby each_with_object und with_index und Rails' sum:

amounts = [100, 200, 150, 300, 120] 

partial_sums = amounts.each_with_object([]).with_index do |(_, obj), i| 
    obj << amounts[0..i].sum 
end      # => [100, 300, 450, 750, 870] 

# Examples: 
partial_sums[0] = 100 # 1st sum - just the first element 
partial_sums[2] = 450 # 3rd partial sum 
partial_sums[-1] = 870 # the total of all the amounts from the array 

Hoffnung, dass nützlich.

+0

kann dies das gleiche mit Hashes verwendet werden? Entschuldigung für Ignoranz, aber wie würdest du das ändern, um es auf Schlüsselwertpaare anzuwenden, da ich immer noch jede kumulative Summe benötige, um einen Schlüssel von: Wochen zu haben, damit ich die beiden in einem Liniendiagramm darstellen kann – timboon

Verwandte Themen