如何处理Rails和Mongoid中的Money

时间:2016-01-22 10:13:06

标签: ruby-on-rails ruby ruby-on-rails-4 mongoid

我知道之前已经问过这个问题,但是我发现的大多数答案都与ActiveRecord或者旧的(大多数情况下都是)有关,我想知道是否有新的看法。

简而言之,我的Rails应用程序是一个API,所以请记住这一点(通常不能使用大量有用的小视图相关帮助程序)。

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

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

因此,为了创建文档,我发送了一个数字,它创建了文档。现在,当我查询同一个文档时,它会返回price_GBP的对象,这很好,但我的主要方法是它返回fractional中的值my_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,我应该使用BigDecimalFloat作为字段类型吗?

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

当我尝试Float时,一切正常,但我读到的地方Float并不是最准确的。

你有什么想法?

1 个答案:

答案 0 :(得分:1)

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

我的建议是继续使用MoneyRails gem并使用built-in helpers输出值。您提到无法使用帮助程序,但我看不出有什么阻止 - Rails包括jbuilder,它允许您在视图中制定您的JSON结构,可以访问所有“有用的小视图相关帮助程序” - 示例

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

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