Rails 3.0.3 を使用して、MySQL データベースに緯度と経度を保存しています。テーブルの作成に使用した移行の一部を次に示します (指定された精度の 10 進数値に注意してください)。
create_table :dummies do |t|
t.decimal :something, :precision => 13, :scale => 10
end
次の RSpec の例は、どこが間違っているかを示しています。
一部の計算に BigDecimal を使用すると、結果my_value
は精度の高い数値になります (移行で指定された数値よりも大きくなります)。オブジェクトをデータベースに保存し、再度取得します。
元の値とデータベース値の比較は、精度が同じではないため失敗し、同じ数値ではなくなります。
it 'should be equals before and after save' do
my_value = BigDecimal('4.123456789') * 5000 # more precise than defined in the migration
dummy = Dummy.new(:something => my_value)
location.save!
Dummy.first.something.should == dummy.something
end
なぜこれが起こっているのか理解しています (MySQL の 10 進数の精度 != BigDecimal の精度) がmy_value
、データベースに書き込む前に BigDecimal の精度を制限して、データベースの制約を確実に尊重する方法を誰か教えてもらえますか?
ありがとう!