如何处理 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 的值 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
不是最准确的。
你有什么想法?
如果您打算对货币值执行任何类型的算术运算,请避免使用 Float
。 BigDecimal
很好,或者您也可以用美分表示值并将其存储为 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)
我知道以前有人问过这个问题,但我找到的大多数答案都与 ActiveRecord 或旧的(大多数情况下,两者都有)有关,我想知道是否有新的答案。
很短,我的 Rails 应用程序是一个 API,所以请记住这一点(通常不能使用很多有用的小视图相关助手)。
我一直在阅读这篇文章,发现 MoneyRails 看起来很简洁。我遇到的问题是,当我检索数据时,它 return 是一个对象而不是可用值:
class MyModel
include Mongoid::Document
...
field :price_GBP, type: Money
...
end
因此,为了创建文档,我发送了一个号码,它创建的文档很好。现在,当我查询同一个文档时,它 return 是 price_GBP
的一个对象,这很好,但我的主要观点是它 return 的值 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
不是最准确的。
你有什么想法?
如果您打算对货币值执行任何类型的算术运算,请避免使用 Float
。 BigDecimal
很好,或者您也可以用美分表示值并将其存储为 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)