2011-11-11 9 views
7

私は「レールの方法」でアプリケーションを作成しようとしていますので、今回はデータベースのレコードを遡及的に処理するのではなく、before_saveメソッドを使用して試しています。before_saveにパラメータを送信

def make_percentage_from(score) 
    percent = (score.fdiv(20) * 100) 
    return percent 
end 

データベースに保存されるすべてのアイテムのスコアは20ですが、データベースに保存される前にこれをパーセンテージで保存したいと思いますが、問題は、送信できないということですbefore_saveを介して属性データ。 make_percentage_from(スコアツー・計算され)私はこれをどのように行うことができます

理想的には私は

before_saveを持っているだろうか?その保存された後、このデータを処理する必要がないようにGoogleは私のために多くを上げていないと私は決定だ(もちろんそこは別の方法で提供!)

おかげに関して

ジェフ

答えて

9

scorepercentageWidgetの属性である場合:

class Widget < ActiveRecord::Base 
    before_validates :calculate_score_percentage 
    validates :percentage, :presence => true 
private 
    def calculate_score_percentage 
    self.percentage = score.fdiv(20) * 100 
    end 
end 

あなたの属性/列の全てがゲッターとセッテを持っているので、これは動作しますActiveRecordによって自動的に定義されるメソッド。 calculate_score_percentageメソッドのscoreへの参照は実際にself.scoreメソッドを呼び出しています。これはscoreオブジェクト/値を返します。 self.percentageを明示的に使用する必要があります。percentだけを使用するのはあいまいです。ローカルのpercentage変数を定義するか、self.percentage=を呼び出すことができます。デフォルトは前者ですが、この場合は私たちが望むものではありません。

私はbefore_validatesを使用しています。これはまだここで検証を使用できることを示しています。これはいくつかの健全性検査に適しています。検証をしたくない場合は、コードを変更せずにbefore_saveのためにスワップアウトすることができます。

+0

優れた徹底的な応答。 –

8

短い答え:コールバックにはパラメータがありません。コールバックは、オブジェクトまたはレコード自身に対してアクションをとるものとします。したがって、パラメータとして必要なものは、属性(データベースに保存される)またはインスタンス変数のいずれかとして格納する必要があります。

関連する問題