2016-06-01 4 views
1

私は体重減少のアプリケーションを構築しています。これは私のアプリでは各ユーザhas_one :profilehas_many :weightsです。各プロフィールbelongs_to :pal。私のアプリが動作するためには、SMRという値が必要です。これは基本的に、ユーザーのサイズ、年齢、性別(すべてプロフィール表から)、ユーザーの現在の体重(体重表から)、およびフロート番号palテーブル。モデルまたはコントローラの計算

私はprofiles_controller.rb showアクションでSMRを計算し、show.html.erbプロファイルに表示できます。

私は今、2つの質問があります

  1. profiles_controller.rb showアクションでこの計算を行うには、それは正しいですか私はprofile.rbモデルでそれを行う必要がありますか?モデルでそれを行う必要がある場合:どのようにすればいいのですか(コードはどのように見えるでしょうか)?
  2. 私のアプリケーションでは、他の計算の変数としてSMRの値が必要になります。これをどのように達成できますか(プロファイルコントローラ/モデルで計算されたが、後で別の場所で必要になる場合)

私はRailsの世界ではかなり新しいので、おそらく私の質問は本当に問題ではありません。

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アクションのみ)

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

あなたの本能は正しいです!モデル内での計算がなく、より理にかなったモデルで行うことも、 'profile'と' current_weigh'を受け取って計算を行うCalculatorクラスを作成することもできます。 「それは後で必要になるかもしれません」に関しては、1日の体重があることがわかります。その重量とその日の計算されたSMRをテーブル自体に保存し、それ以外の場所に照会することができます。 SMRが存在しない場合は、それを計算して保存します。 – lcguida

+1

サービスでcalculatonsを行う –

答えて

4

は、私はあなたが別のクラスを作成する必要がありますかあなたにもプロファイルモデルに

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 

を行うと、お使いのコントローラのshowメソッドでこのクラスを呼び出すことができると思います

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

とモデルフォルダ

にsmr_calculator.rbとして、このクラスを追加します。このような

あなたは@smrが必要なので、プロファイルと現在のユーザーでこのクラスを呼び出すことができます

+0

恐ろしい!まさに私が探していたもの!ありがとう。 – Oliver

関連する問題