我知道之前已经问过这个问题,但是我发现的大多数答案都与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,我应该使用BigDecimal
或Float
作为字段类型吗?
当我尝试BigDecimal
时,数据保存正常,但是当我检索它时,我得到的是字符串而不是数字。这是正确的行为吗?
当我尝试Float
时,一切正常,但我读到的地方Float
并不是最准确的。
你有什么想法?
答案 0 :(得分:1)
如果您计划对货币值执行任何类型的算术运算,请避免使用Float
。 BigDecimal
很好,或者您也可以用美分表示值并将其存储为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)