将我的应用程序从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]
答案 0 :(得分:1)
找到答案!它实际上是ActiveRecord
4.2.5(Rails Respect scale of the column in the Decimal type)中实现的功能。可悲的是,它没有包含在release notes中:(