データベースに小数として保存している多数のフィールドを含むフォームがあります。
ただし、ユーザーが分数、特に混合数 (例: 38 1/2) を入力できるようにしたいと考えています。
この回答は、混合数を分数に変換するための優れたソリューションを提供します。これを変更して、モデルの関数に入れました。
def to_dec
self.chest = self.chest.split.map { |r| Rational(r) }.inject(:+).to_f
end
そして、私はそれをvalidate :to_dec
and で呼び出すことを実験しましbefore_save :to_dec
た。ただし、これらはどちらも機能しません。
理由はわかっていますが、それを修正する方法はありません。
を使用puts self.chest
することで、値を数値に変換する方法を微調整する前に、その値が数値に変換されていることを知ることができます。フォームに「10 1/2」と入力して保存するとputs self.chest
、関数が次の場合でも 10.0 になります。
def to_dec
puts self.chest
end
さらに、puts '38 1/2'.split.map { |r| Rational(r) }.inject(:+).to_d
38.5 が表示されるので、変換に問題がないことがわかります。
ビューの入力タイプを数値から文字列に変更しましたが、モデルではまだ数値になっているようです。
私は立ち往生しています。
また、他のフィールドの一部も混合数をサポートする必要があります。値ごとに異なる関数を記述する必要がないように、何らかの方法でこれを抽象化したいと考えています。