2017-04-05 7 views
1

私のRailsアプリケーションでは、ユーザがパーセント値を0.0から100.0の小数で入力できるようにしたいと考えています。データベースでは、0.00から1.00までの小数点として保存したいので、計算が簡単です。Ruby on Railsでgetterとsetterを使ってパーセンテージを表現する

私は現在、このモデルでgettersとsettersを通してこれを行っています。

# in the model `quote.rb` 

def discount=(value) 
    write_attribute :discount, value.to_f/100 
end 
def discount 
    read_attribute(:discount).to_f * 100 
end 

def final_price 
    price * (1 - discount) 
    # this generates a wrong value, 
    # because if the user inputs discount as 50 to represent 50%, 
    # the final price will be `price * -49` 
end 

:私はモデルで派生属性を記述するときしかし、その後、彼らは簡単な計算のための0-1の値で、それを格納する目的に反し0-100の値の代わりに、0-1を、使用して終了しますこれを達成するためのより良い方法に関するアイデア?

+2

なぜそれらを0..100の範囲の整数として保存せず、代わりに 'final_price'を' price *(1 - discount/100.0) 'に変更しますか? – tadman

+0

"0-100の代わりに0-100の値を使用することになります。なぜ、オーバーライドされたゲッターを削除して見ないのですか?あるいは、 'final_price'で' read_attribute(:discount) 'を直接使うのがいいですか?または、0-100ゲッター/セッターと0-1カラム(discount_percentageとdiscount_fractionなど)の名前を変えて、必要に応じて両方を使用できるようにしてください。 –

+0

@tadman "なぜそれらを0..100の範囲の整数として保存しないでください - 与えられた理論的根拠は"計算を簡単にする "ことです。実際、いくつかのレポートをどのように簡単に作成できるかがわかりました。 '選択価格*割引AS adjusted_price ...'。 –

答えて

0

生の値をパーセント値で保存してキャストするのを避けるために小数点以下の列を使用します(issues with floats and roundingを避けるため)。

あなたは、単に使用して正味価格を計算することができ

:それはそれが簡単に対処することができますよう、それはあなたが道money gem見たいユーザーに出力を提示して扱うことになると

def final_price 
    price * (discount || 100 * 0.01) 
end 

をロケールと複数の通貨。

+0

0-100から0-100へ行くのは単純に 'x * 0.01'です - 変換された値を複雑でないか、計算するのに費用がかかるので、変換された値をdbに格納することは実際にはわかりません。 – max

関連する問題