精度8とスケール2の小数を含む移行を定義するRailsアプリケーションがあります。セットアップしたデータベースはPostgreSQL9.1データベースです。
class CreateMyModels < ActiveRecord::Migration
def change
create_table :my_models do |t|
t.decimal :multiplier, precison: 8, scale: 2
t.timestamps
end
end
end
を実行するrake db:migrate
と、移行は正常に実行されますが、を実行しようとしたときにエラーが発生しましたMyModel.find_or_create_by_multiplier
。次のコマンドを2回実行すると、オブジェクトが2回作成されます。
MyModel.find_or_create_by_multiplier(multiplier: 0.07)
これにより、最初の呼び出しでオブジェクトが作成され、2番目の呼び出しでオブジェクトが見つかると想定しています。残念ながら、これは乗数を0.07に設定した場合には発生しないようです。
これは、上記のコマンドでスローした他のすべての番号に対して期待どおりに機能します。次のコマンドは期待どおりに機能します(最初の呼び出しでオブジェクトを作成し、2番目の呼び出しでオブジェクトを検索します)。
MyModel.find_or_create_by_multiplier(multiplier: 1.0)
MyModel.find_or_create_by_multiplier(multiplier: 0.05)
MyModel.find_or_create_by_multiplier(multiplier: 0.071)
MyModelテーブルのPostgreSQLデータベースの説明を表示すると、テーブルに数値列の制限がないことがわかります。
Column | Type | Modifiers
-------------+-----------------------------+-------------------------------------------------------
id | integer | not null default nextval('my_models_id_seq'::regclass)
multiplier | numeric |
created_at | timestamp without time zone | not null
updated_at | timestamp without time zone | not null
私のdb/schema.rbファイルにも、精度とスケールが記載されていません。
ActiveRecord::Schema.define(:version => 20121206202800) do
...
create_table "my_models", :force => true do |t|
t.decimal "multiplier"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
...
だから私の最初の質問は、移行するときにPostgreSQLに精度とスケールが押し下げられないのはなぜですか?ドキュメントには、サポートする必要があると記載されています。
私の2番目の質問は、なぜ0.07がMyModel.find_or_create_by_multiplier(multiplier: 0.07)
コマンドを使用して正しく比較されないのですか?(これについて別の質問を開く必要がある場合は、そうします)。