Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将money rails gem配置为以高于4位数的精度工作_Ruby On Rails_Ruby_Currency_Money Rails - Fatal编程技术网

Ruby on rails 如何将money rails gem配置为以高于4位数的精度工作

Ruby on rails 如何将money rails gem配置为以高于4位数的精度工作,ruby-on-rails,ruby,currency,money-rails,Ruby On Rails,Ruby,Currency,Money Rails,我们在应用程序中使用moneyrailsgem。到目前为止,4位小数精度还可以,但我们需要切换到6位。不幸的是,我无法将更高精度的数字存储到Postgres中-数字在保存之前是四舍五入的 class MyModel1.81123456789 my_model.save my_model.price.to_f#=>1.8112 ActiveRecord的输出表明,修剪后的数字实际上正在发送到数据库。(请注意第181.12节) 有没有办法让moneyrailsgem更精确地工作?似乎Money g

我们在应用程序中使用
moneyrails
gem。到目前为止,4位小数精度还可以,但我们需要切换到6位。不幸的是,我无法将更高精度的数字存储到Postgres中-数字在保存之前是四舍五入的

class MyModel
货币本身似乎运作良好,精确度更高

pry(main)> Money.new(181.123456789).to_f
=> 1.81123456789
控制台中的测试模型。保存之前,所有操作都正常

my_model=MyModel.find(1)
my_model.price=Money.new(181.123456789)
my_model.price.to_f#=>1.81123456789
my_model.save
my_model.price.to_f#=>1.8112
ActiveRecord的输出表明,修剪后的数字实际上正在发送到数据库。(请注意第181.12节)


有没有办法让
moneyrails
gem更精确地工作?似乎Money gem本身就没有更高精度的问题。

这种行为来自于货币舍入,要关闭它,请使用:

Money.infinite\u precision=true
以下是测试:

需要“绑定器/内联”
gemfile(ENV['INSTALL']=='1')执行
来源“https://rubygems.org"
gem“rails”,“~>6.0”
gem“sqlite3”
宝石“金钱轨道”
结束
需要“微型测试/自动运行”
需要“记录器”
需要“活动记录”
需要“金钱轨道”
ActiveRecord::Base.建立\u连接(适配器:“sqlite3”,数据库:::内存:)
ActiveRecord::Base.logger=logger.new(标准输出)
ActiveRecord::Schema.define do
创建表格(:models,force:true){| t | t.decimal:price_cents,默认值:0,精度:30,比例:10}
结束
#要删除配置警告,请执行以下操作:
Money.locale_backend=:currency
货币。默认货币=:美元
#实际修复:
Money.infinite_精度=真
MoneyRails::Hooks.init#在普通应用程序中会自动调用
类模型
该列使用哪种数据库类型?如模型定义中的注释所示-精度为30的十进制和10的小数设置货币的无限精度gem是我做的第一件事。不幸的是,这对我来说不起作用。然而,即使使用PostgreSQL,此测试也可以正常工作,因此我的应用程序中一定有可疑之处。我们的应用程序中存在一个隐藏的舍入,这导致了问题。谢谢你的回答,确保我的宝石配置正确!
UPDATE "my_models" SET "price_cents" = $1 ... [["price_cents", "181.12"] ...]