2010-09-28 17 views
5

¿Cómo debo trabajar con Money con MongoID? ¿Debo configurarlo como BigDecimal? ¿Y a nivel de rieles? Para ActiveRecord tenemos algo llamado Money, pero AFAIK solo admite ARrepresentación monetaria en mongoid

+0

lo que es el dinero? – shingara

+0

como decimal, int, flotantes ... – luckytaxi

+0

dm es correcto. Nunca use números de coma flotante para representar dinero (como flotadores, dobles). Esto hará mucho butthurt. Perderás centavos durante la representación. Por ejemplo, 10.2 puede representarse como 10.19999 (9). Durante el redondeo y diferentes operaciones aritméticas obtendrá un error creciente. [¿Por qué no usar el doble para representar la moneda] (http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency/3730040#3730040) – Dao

Respuesta

3

MongoDB almacena números en varios tipos de datos BSON (int, long int, double). Le recomiendo que almacene dinero como centavos (si es moneda de EE. UU.) Y use el tipo de datos int largo.

7

Me encontré con esto también. Desafortunadamente, BigDecimal almacena en Mongodb como una cadena, por lo que no le permitirá sumar, ordenar, etc. en ella como un flotador o int.

entero parece ser el camino a seguir almacenando el valor en céntimos, posiblemente utilizando la gema dinero a ella abstraer un poco: https://github.com/RubyMoney/money

Mongo almacena el int usando 64 bits en la mayoría de las máquinas modernas Creo que sí existe no hay mucho riesgo de necesitar una cantidad mayor, incluso en centavos. Parece que puedes almacenar entre -9,223,372,036,854,775,808 y 9,223,372,036,854,775,807 centavos, así que quítate dos decimales para obtener tu valor mínimo/máximo en dólares.

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

2

Si le gusta la gema de dinero, puede almacenarla como un tipo de dinero.

Un ejemplo: https://gist.github.com/michaelkoper/5007636

Almacena el dinero como una matriz [centavos de dólar, la moneda]

class Product 
    include Mongoid::Document 

    field :price, type: Money 
end 

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