我有一个 Rails 应用程序,它定义了一个包含精度为 8 和小数位数为 2 的小数的迁移。我设置的数据库是 PostgreSQL 9.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
. 如果我运行以下命令两次,对象将被创建两次:
MyModel.find_or_create_by_multiplier(multiplier: 0.07)
我假设这应该在第一次调用期间创建对象,然后在第二次调用期间找到对象。不幸的是,当乘数设置为 0.07 时,这似乎并没有发生。
对于我在上述命令中抛出的所有其他数字,这确实可以按预期工作。以下命令按预期工作(在第一次调用期间创建对象,然后在第二次调用期间找到对象)。
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?文档说明它应该被支持。
我的第二个问题是,为什么 0.07 不能正确比较使用MyModel.find_or_create_by_multiplier(multiplier: 0.07)
命令?(如果我需要为此提出另一个问题,我会的)。