2010-09-28 7 views
5

Comment dois-je travailler avec Money avec MongoID? Dois-je le configurer en BigDecimal? Et au niveau des rails? Pour ActiveRecord nous avons quelque chose appelé Money, mais AFAIK il prend seulement en charge ARreprésentation de l'argent dans mongoid

+0

ce qui est de l'argent? – shingara

+0

comme décimal, int, flotte ... – luckytaxi

+0

dm a raison. N'utilisez jamais de nombres à virgule flottante pour représenter de l'argent (comme des flotteurs, des doubles). Cela fera beaucoup de butthurt. Vous perdrez des centimes pendant la représentation. Par exemple, 10.2 peut être représenté comme 10.19999 (9). Pendant l'arrondi et les différentes opérations arithmétiques, vous obtiendrez une erreur croissante. [Pourquoi ne pas utiliser double pour représenter la monnaie] (http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency/3730040#3730040) – Dao

Répondre

3

MongoDB stocke des numéros dans divers types de données BSON (int, long int, double). Je vous recommande de stocker l'argent en cents (si la devise américaine) et d'utiliser le type de données int long.

7

J'ai couru dans ceci aussi. Malheureusement BigDecimal stocke dans Mongodb sous la forme d'une chaîne, donc il ne vous laissera pas additionner, trier, etc comme un float ou un int.

Entier semble être le moyen d'aller stocker la valeur en cents, en utilisant peut-être le joyau de l'argent à l'abstrait un peu: https://github.com/RubyMoney/money

Mongo stocke l'int en utilisant 64 bits sur la plupart des machines modernes, je pense donc il est pas beaucoup de risque d'avoir besoin d'une plus grande quantité, même en cents. Il semble que vous puissiez stocker entre -9.223.372.036.854.775.808 et 9.223.372.036.854.775.807 cents, alors prenez deux décimales pour obtenir votre valeur min/max en dollars.

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

2

Si vous aimez la gemme de l'argent, vous pouvez le stocker comme un type d'argent.

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

Il stocke l'argent comme un tableau [cents, monnaie]

class Product 
    include Mongoid::Document 

    field :price, type: Money 
end 

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