从4.2.4升级到4.2.5后的十进制舍入

时间:2016-08-25 15:22:09

标签: ruby-on-rails ruby-on-rails-4

将我的应用程序从Rails 4.2.4升级到4.2.5后,我有一些奇怪的十进制属性问题。

我有一些带有十进制属性的类,例如我的Salary类有一个net_pay。我对这些属性进行了验证,以验证它们只有两位小数(因为它代表金钱)。升级后,我对这些money属性的所有验证测试都失败了(尝试将属性设置为超过2位小数的值并验证记录是否无效)。我看着控制台,发现了一个奇怪的行为:

Running via Spring preloader in process 18463
Loading development environment (Rails 4.2.5)
irb(main):001:0> salary = Salary.new
=> #<Salary id: nil, net_pay: nil, account_debit: nil, payment_at: nil, comment: nil, attachment: nil, approved_at: nil, status: 0, created_at: nil, updated_at: nil>
irb(main):002:0> salary.net_pay = 123.456789
=> 123.456789
irb(main):003:0> salary.net_pay
=> #<BigDecimal:55b6facd4400,'0.12346E3',18(27)>
irb(main):004:0> salary.net_pay.to_s
=> "123.46"
呃,什么?我的小数在哪里?!请注意0.12346E3。我尝试了4.2.4的相同示例,结果如下:

Running via Spring preloader in process 18756
Loading development environment (Rails 4.2.4)
irb(main):001:0> salary = Salary.new
=> #<Salary id: nil, net_pay: nil, account_debit: nil, payment_at: nil, comment: nil, attachment: nil, approved_at: nil, status: 0, created_at: nil, updated_at: nil>
irb(main):002:0> salary.net_pay = 123.456789
=> 123.456789
irb(main):003:0> salary.net_pay
=> #<BigDecimal:563cf1cb59d8,'0.123456789E3',18(36)>
irb(main):004:0> salary.net_pay.to_s
=> "123.456789"

为什么Rails会自动设置4.2.5而不是4.2.4中的小数属性的比例? (这是一个功能吗?我在迁移中声明了scale: 2

更新

首先,我尝试直接更新到4.2.7.1,然后更新到4.2.5并遇到同样的问题。

Gemfile上的差异:

-gem 'rails', '4.2.4'
+gem 'rails', '4.2.5'

我在升级Rails之前更新了所有宝石,虽然更新Rails意味着当然要更新很多其他宝石......

Ruby版本没有改变:

ruby -v
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-linux]

1 个答案:

答案 0 :(得分:1)

找到答案!它实际上是ActiveRecord 4.2.5(Rails Respect scale of the column in the Decimal type)中实现的功能。可悲的是,它没有包含在release notes中:(