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
Trả lời
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.
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.
Tôi khuyên bạn nên thử đường ray thay thế. https://github.com/RubyMoney/money-rails Nó được duy trì khá tốt và hoạt động với mongoid quá!
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"
tiền là bao nhiêu? – shingara
như số thập phân, int, phao ... – luckytaxi
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