2010-09-28 47 views
5

我应该如何使用MongoID与Money合作?我应该将其配置为BigDecimal吗?在轨道水平?对于ActiveRecord,我们有一些叫做Money的东西,但是AFAIK它只支持ARmongoid中的货币表示

+0

钱是什么? – shingara 2010-09-28 15:41:54

+0

像小数,int,float ... – luckytaxi 2010-09-28 15:53:59

+0

dm是对的。切勿使用浮点数来表示金钱(如花车,双打)。这会造成很多麻烦。在演示过程中您将损失美分。例如10.2可以表示为10.19999(9)。在舍入和不同的算术运算期间,你将会遇到越来越多的错误[为什么不用double来表示货币](http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency/3730040#3730040) – Dao 2011-04-13 18:43:04

回答

3

MongoDB将数字存储在各种BSON数据类型(int,long int,double)中。我建议您将货币存储为美分(如果是美元货币)并使用long int数据类型。

7

我也碰到过这个。不幸的是BigDecimal在Mongodb中作为一个字符串存储,所以它不会让你像float或int那样对它进行求和,排序等。

整数似乎走在仙存储的值,可能用这些钱宝石抽象了一点的方式:https://github.com/RubyMoney/money

蒙戈存储上使用最现代化的机器我是这么认为的有64位整型即使以美分计算,也不需要大量的风险。看起来您可以存储-9,223,372,036,854,775,808和9,223,372,036,854,775,807美分之间的数字,因此请取下两位小数,以美元计算您的最小/最大值。

http://en.wikipedia.org/wiki/Integer_(computer_science)

2

如果你喜欢钱宝石,你可以将它存储为钱类型。

一个例子:https://gist.github.com/michaelkoper/5007636

它存储的钱作为数组[美分,货币]

class Product 
    include Mongoid::Document 

    field :price, type: Money 
end 

product = Product.new(:price => Money.new(1000, 'EUR')) 
product.price.format 
# => "€10.00"