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:
- Ist es richtig, diese Berechnung in der
profiles_controller.rb
show-Aktion zu tun, oder sollte ich tun es in derprofile.rb
Modell? Wenn ich es im Modell machen sollte: Wie kann ich das machen (wie soll der Code aussehen)? - 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
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
tun calculatons in services –