2010-09-28 23 views
5

Tôi nên làm việc với Money bằng MongoID bằng cách nào? Tôi có nên cấu hình nó như BigDecimal không? Và ở cấp độ đường ray? Đối với ActiveRecord, chúng tôi có thứ gọi là Money, nhưng AFAIK chỉ hỗ trợ ARđại diện tiền trong mongoid

+0

tiền là bao nhiêu? – shingara

+0

như số thập phân, int, phao ... – luckytaxi

+0

dm là đúng. Không bao giờ sử dụng số dấu phẩy động để đại diện cho tiền (như nổi, tăng gấp đôi). Điều này sẽ làm cho rất nhiều butthurt. Bạn sẽ mất xu khi biểu diễn. Ví dụ 10.2 có thể được biểu diễn như 10.19999 (9). Trong làm tròn và các phép tính số học khác nhau, bạn sẽ nhận được lỗi ngày càng tăng. [Tại sao không sử dụng gấp đôi để đại diện cho tiền tệ] (http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency/3730040#3730040) – Dao

Trả lời

3

Số cửa hàng MongoDB ở các loại dữ liệu khác nhau (int, long int, double). Tôi khuyên bạn nên lưu trữ tiền là xu (nếu tiền tệ của Hoa Kỳ) và sử dụng kiểu dữ liệu int dài.

7

Tôi cũng gặp phải điều này. Thật không may các cửa hàng BigDecimal trong Mongodb như là một chuỗi, do đó, nó sẽ không cho phép bạn tổng hợp, sắp xếp, vv trên nó như một phao hoặc int.

Integer dường như là con đường để đi lưu trữ các giá trị theo đơn vị cent, có thể sử dụng đá quý Tiền để trừu tượng nó một chút: https://github.com/RubyMoney/money

Mongo lưu int sử dụng 64 bit trên hầu hết các máy móc hiện đại, tôi nghĩ vậy có không có nhiều nguy cơ cần một số tiền lớn hơn ngay cả trong xu. Có vẻ như bạn có thể lưu trữ trong khoảng từ −9,223,372,036,854,775,808 và 9,223,372,036,854,775,807 cent, vì vậy hãy cất hai chữ số thập phân để nhận giá trị tối thiểu/tối đa bằng đô la.

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

2

Nếu bạn thích đá quý, bạn có thể lưu nó dưới dạng loại tiền.

Một ví dụ: https://gist.github.com/michaelkoper/5007636

Nó lưu trữ tiền như một mảng [cent, tệ]

class Product 
    include Mongoid::Document 

    field :price, type: Money 
end 

product = Product.new(:price => Money.new(1000, 'EUR')) 
product.price.format 
# => "€10.00" 
Các vấn đề liên quan