2016-06-01 5 views
1

Ich bilde eine Gewichtsverlust-App. Dazu in meiner App jeder Benutzer has_one :profile und has_many :weights. Jedes Profil belongs_to :pal. Damit meine App funktioniert, brauche ich einen Wert namens SMR, der im Grunde genommen eine Formel ist, die Größe, Alter und Geschlecht des Benutzers (alle aus der Profiltabelle), das aktuelle Gewicht des Benutzers (aus der Gewichtungstabelle) sowie eine Gleitkommazahl als Variablen verwendet Pal Tisch.Berechnung in Modell oder Controller

Ich bin in der Lage, SMR in profiles_controller.rb Aktion zeigen und zeigen Sie es in den Profilen show.html.erb.

Ich habe zwei Fragen jetzt:

  1. Ist es richtig, diese Berechnung in der profiles_controller.rb show-Aktion zu tun, oder sollte ich tun es in der profile.rb Modell? Wenn ich es im Modell machen sollte: Wie kann ich das machen (wie soll der Code aussehen)?
  2. Ich brauche den SMR-Wert später in meiner App als eine Variable für andere Berechnungen. Wie kann ich dies erreichen (wenn es im Profil Controller/Modell berechnet wird, aber später woanders benötigt wird)?

Ich bin ziemlich neu in der Rails-Welt, vielleicht sind meine Fragen wirklich noob Fragen.

profile.rb

class Profile < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :pal 
    belongs_to :goal 


    def age 
    if birthdate != nil 
     now = Time.now.utc.to_date 
     now.year - birthdate.year - (birthdate.to_date.change(:year => now.year) > now ? 1 : 0) 
    else 
     nil 
    end 
    end 
end 

weight.rb

class Weight < ActiveRecord::Base 
    belongs_to :user 
end 

pal.rb

class Pal < ActiveRecord::Base 
    has_many :profiles 
end 

profiles_controller.rb (show-Aktion nur)

def show 
    @pal = @profile.pal 
    @goal = @profile.goal 
    @current_weight = Weight.where(:user_id => current_user.id).order(:day).last 

    if @profile.gender == 0 
     @smr = (10*@current_weight.kilograms+6.25*@profile.size-5*@profile.age+5)*@pal.value 
    elsif @profile.gender == 1 
     @smr = (10*@current_weight.kilograms+6.25*@profile.size-5*@profile.age-161)*@pal.value 
    else 
     nil 
    end 
    end 
+0

Ihre Instinkte sind korrekt! Keine Berechnungen im Modell, Sie können in dem Modell, das sinnvoller ist, oder erstellen Sie eine Calculator-Klasse, die 'profile' und' current_weigh' empfängt und die Berechnung durchführt. In Bezug auf "Ich brauche es später" sehe ich, dass Sie ein Gewicht pro Tag haben. Sie können die berechnete SMR für dieses Gewicht und diesen Tag in der Tabelle selbst speichern und dann nur an anderer Stelle konsultieren. Wenn kein SMR vorhanden ist, berechnen und speichern Sie es. – lcguida

+1

tun calculatons in services –

Antwort

4

Ich denke, Sie eine eigene Klasse erstellen soll, oder Sie können auch

class SmrCalculator 
    def initialize(profile, user) 
    @profile = profile 
    @user = user 
    end 

    def get_smr 
    @pal = @profile.pal 
    @goal = @profile.goal 
    @current_weight = Weight.where(:user_id => @user.id).order(:day).last 

    if @profile.gender == 0 
     @smr = (10*@current_weight.kilograms+6.25*@profile.size-5*@profile.age+5)*@pal.value 
    elsif @profile.gender == 1 
     @smr = (10*@current_weight.kilograms+6.25*@profile.size-5*@profile.age-161)*@pal.value 
    else 
     nil 
    end 
    @smr 
    end 

end 

Und nennen diese Klasse auf dem Controller zeigen Methode auf Profilmodell tun wie folgt aus:

@smr_calculator = SmrCalculator.new(@profile, current_user) 
@smr = @smr_calculator.get_smr 

Und fügen Sie diese Klasse als smr_calculator.rb in Modellen Ordner

so überall in der App benötigen Sie @smr Sie können diese Klasse mit Profil und aktuellen Benutzer anrufen

+0

Super! Genau das, was ich gesucht habe! Vielen Dank. – Oliver

Verwandte Themen