【发布时间】:2017-12-13 17:21:17
【问题描述】:
我有一个带有unit_price、discount_price、final_price 等的Order 模型。
都是postgres db 中的integer 字段。目前它的舍入量为下一个整数并保存。但是现在我发现这不是一个好方法,因为它可能会在将来导致一些错误/问题。所以我
计划通过做(USD*100) 来节省一分钱的价值,但在显示时通过编写一些帮助程序以英镑显示。
但我现在找到了这个宝石money-rails,它可以做我想做的事。我正试图围绕这个宝石转转,但我无法真正弄清楚这里使用的一些约定,也不确定它是否适合我的目的
我的默认货币是GBP。
我可以看到这个 gem 默认使用约定 _cents
monetize :price_cents #from docs
以上假设有一个 db 列 price_cents。
这里为什么要使用 cents 作为静态列?这样做的目的是什么?除了在这里明确之外还有其他用途吗?
如果它用于cents 之类的目的,它会自动查找USD,如果penny 查找GBP 等...那么对于我们的应用支持的每种货币,我们最终将创建新的数据库列,例如@987654339 @、price_cent 等。如果有很多货币,这不是很好。或者我可以在这里使用一个通用名称,比如 price_smallest 并且不管货币类型如何都可以使用它?
还有
我无法正确找出确切的用例。有人可以对这个话题有所了解吗?
注意:我的应用现在没有支持其他货币的计划。 但将来可能会添加。太好了,现在我认为..
【问题讨论】:
-
它似乎适用于inference purposes,例如
monetize :price,默认配置将假定price_cents和price_currency。您可以看到“_cents”是default configuration 中amount列的默认后缀。 -
由于默认货币是“美元”,而美分是美国货币体系中最小的面额,因此将其作为后缀是最有意义的。话虽这么说,它不需要是美分,但不需要按货币类型分隔,这只是一种约定,可以根据您认为合适的方式配置为“_cents”列或您选择的任何名称将包含基于货币的子单位值。例如cents 的 subunit_to_unit 为 100,因为整体有 100 美分
-
This Spec Test 清楚地表明您可以在哪里看到以美元计的美分预计为 2,000,000,但在 CLP(其 subunit_to_unit 为 1)中,“美分”预计与金额 20,000
-
@engineersmnky 谢谢你说清楚。请提供答案,以便我接受。
标签: ruby-on-rails ruby postgresql currency money-rails