PostgreSQL是否支持Rails的精度和规模?

Jon*_*Jon 6 postgresql ruby-on-rails ruby-on-rails-3

我有一个Rails应用程序,它定义了一个包含精度为8和scale 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
Run Code Online (Sandbox Code Playgroud)

当我运行时rake db:migrate,迁移成功,但我在尝试运行时发现错误MyModel.find_or_create_by_multiplier.如果我运行以下命令两次,该对象将被创建两次:

MyModel.find_or_create_by_multiplier(multiplier: 0.07)
Run Code Online (Sandbox Code Playgroud)

我假设这应该在第一次调用期间创建对象,然后在第二次调用期间找到该对象.不幸的是,乘数设置为0.07时似乎没有发生这种情况.

DOES预期因为我已经在上面的命令抛出每隔数工作.以下命令按预期工作(在第一次调用期间创建对象,然后在第二次调用期间查找对象).

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)
Run Code Online (Sandbox Code Playgroud)

当我查看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
Run Code Online (Sandbox Code Playgroud)

我的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
...
Run Code Online (Sandbox Code Playgroud)

所以我的第一个问题是,为什么我在迁移时没有看到精确度和规模被推到PostgreSQL?文档声明应该支持它.

我的第二个问题是,为什么0.07没有正确比较使用MyModel.find_or_create_by_multiplier(multiplier: 0.07)命令?(如果我需要为此开另一个问题,我会).

Jon*_*Jon 8

这很尴尬......

我精确拼写错误.

将迁移更改为:

t.decimal :multiplier, precision: 8, scale: 2
Run Code Online (Sandbox Code Playgroud)

修复一切.