如何处理 Rails 和 Mongoid 中的 Money

How to deal with Money in Rails and Mongoid

我知道以前有人问过这个问题,但我找到的大多数答案都与 ActiveRecord 或旧的(大多数情况下,两者都有)有关,我想知道是否有新的答案。

很短,我的 Rails 应用程序是一个 API,所以请记住这一点(通常不能使用很多有用的小视图相关助手)。

我一直在阅读这篇文章,发现 MoneyRails 看起来很简洁。我遇到的问题是,当我检索数据时,它 return 是一个对象而不是可用值:

class MyModel
  include Mongoid::Document
  ...
  field :price_GBP,  type: Money
  ...
end

因此,为了创建文档,我发送了一个号码,它创建的文档很好。现在,当我查询同一个文档时,它 return 是 price_GBP 的一个对象,这很好,但我的主要观点是它 return 的值 fractionalmy_obj.price_GBP[:fractional] 作为字符串而不是数字。

我宁愿我的客户不必将字符串转换为数字而不是十进制。

我想我可以创建一个小帮手,在这种情况下(在我的模型中)转换值:

def my_helper
  self.price_GBP = BigDecimal(self.price_GBP) # or something along those lines
end

然后在我的控制器中:

@my_model = Model.find(id)
@my_model.price_GBP = @my_model.price_GBP = @my_model.my_helper
render json: @my_model

考虑到上述情况,这是最好的方法吗?如果是,那么使用 MoneyRails gem 有什么意义?

其次,如果不使用MoneyRails gem,我应该使用BigDecimal还是Float作为字段类型?

当我尝试 BigDecimal 时,数据保存正常,但是当我检索它时,我得到的是一个字符串而不是一个数字。这是正确的行为吗?

当我尝试 Float 时一切正常,但我在某处读到 Float 不是最准确的。

你有什么想法?

如果您打算对货币值执行任何类型的算术运算,请避免使用 FloatBigDecimal 很好,或者您也可以用美分表示值并将其存储为 Integer。这实际上是金钱 gem 的运作方式。

我的建议是继续使用 MoneyRails gem 并使用 built-in helpers to output the values. You mentioned not being able to use the helpers but I don't see what's preventing that - Rails includes jbuilder,它允许您在可以访问所有 [=19] 的视图中制定 JSON 结构=] - 例如

# app/views/someresource/show.json.jbuilder

# ...other attributes
json.price_GBP = humanized_money(@my_model.price_GBP)