Ruby on Rails:将货币保存到数据库表的列中的方法

3

我有一个名为cost的数据库表,其中包含amount和currency列。我正在寻找一种解决方案来将货币保存到此列中。

您建议使用哪种数据类型来存储货币,并且应该在其中保存什么值(ISO代码、货币符号等)?或者像Java中那样,Ruby中已经有了Currency数据类型吗?


1
这个问题在这里已经讨论过。希望对你有所帮助。 - Thierry M.
他们确实讨论了如何在视图中使用number_to_currency显示货币时如何处理它们,但我的问题是找到一种实用的方法将货币保存到数据库表中。 - software knife
2个回答

4
以下是所有Rails 4 (ActiveRecord迁移)数据类型:
- :binary - :boolean - :date - :datetime - :decimal - :float - :integer - :primary_key - :references - :string - :text - :time - :timestamp 来源: Rails 4:可用数据类型列表 正如您所见,没有货币数据类型。我建议您为金额创建一个十进制列,并为货币创建一个整数列。
为什么是整数?因为您可以在模型中为该列设置枚举,如下所示:
enum currency: [:dollar]

这将创建一个与枚举相同名称的方法,因此假设您有一个成本变量:

cost.dollar?

这将根据值返回true或false。

此外,您可以轻松创建一些情况,以使您喜欢的所有货币更改:

case cost.currency
when Cost.currencies[:dollar]
  # Do something
end

始终将此列与Cost.currencies[:symbol_of_currency]进行比较,而不是数字(枚举类似于C,0将是第一个元素),这样可以更改枚举内元素的顺序或添加新元素,而不会更改应用程序的功能。

此外,这使您可以像这样在数据库中创建行:

Cost.create(currency: :dollar, amount: 30.0, ...)

将货币保存为整数并使用枚举似乎可以正常工作。但我想找到像Currency.new(cost.currency)这样的东西。假设已经有一个名为currency的Ruby类。 - software knife
在编程中,您不应该将一个数量保存为浮点数,因为在计算中可能会丢失精度。 - Simone Carletti
@SimoneCarletti,使用十进制是更好的选择吗? - software knife
你说得对,最终可能会得到奇怪的值。我已经将其编辑为十进制。 - alebian

3
一般来说,你应该将金额保存为整数,因为浮点数存在舍入误差,绝对不适合用于表示货币。
由于钱可以有小数部分,所以通常整数表示的是以分为单位的金额,这样你就可以轻松地对金额进行操作,然后除以/100以获得以美元为单位的值。
在 Ruby 中,处理货币和金钱的最流行库是money库。实际上,该库使用了我刚才描述的完全相同的方法。事实上,该库曾经被移植到使用 BigDecimal,它是一个专门用于处理任意精度整数算术的 Ruby 库。
如果您想在 Rails 中使用它,那么money-rails库是一个快速的解决方案。但是,您并不需要使用这个库,也不需要使用money库,特别是如果您的需求仅限于特定模型和基本操作。
这是你的选择。但是,你真的应该使用整数表示金额。至于货币,你可以使用简单的 varchar 字段,并使用 3 个字符的标准表示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接