Ruby Rails:一种将货币保存到数据库中的列中的方法-table

Ruby on Rails: A way to save currency into a column within a database-table

我有一个数据库-table 成本与列金额和货币。我正在寻找将货币保存到此列中的解决方案。

您有什么建议:货币列的数据类型以及我应该在其中保存什么值(iso 代码、货币符号...)?或者可能 ruby 中已经有一个数据类型 Currency 就像 java?

以下是所有 Rails 4(ActiveRecord 迁移)数据类型:

  • :binary
  • :boolean
  • :date
  • :datetime
  • :decimal
  • :float
  • :integer
  • :primary_key
  • :references
  • :string
  • :text
  • :time
  • :timestamp

来源:Rails 4: List of available datatypes

如您所见,没有数据类型货币。我建议您为金额创建一个小数列,为货币创建一个整数。

为什么是整数?好吧,因为您可以像这样在模型中为该列设置一个枚举:

enum currency: [:dollar]

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

cost.dollar?

这将 return 真或假取决于值。

此外,您还可以轻松地创建一些案例,以您喜欢的货币进行所有更改:

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

始终将此列与 Cost.currencies[:symbol_of_currency] 而不是数字进行比较(枚举就像 C 一样工作,0 将是第一个元素),这将允许您更改顺序枚举中的元素或添加新元素而不更改应用程序的功能。

此外,这允许您像这样在数据库中创建行:

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

一般情况下,你把金额存成整数,因为floating point are known to have rounding errors肯定不适合代表钱。

因为钱可以有小数,整数表示以分表示的金额是很常见的,这样您就可以轻松地对金额进行运算,然后除以 /100 得到美元的价值。

money gem 是 Ruby 中处理货币和货币的最受欢迎的库。在内部,该库使用与我刚才描述的完全相同的方法。实际上,该库在过去被移动到使用 BigDecimal,它是一个 Ruby-specific 库,用于处理任意精度整数运算。

如果您想在 Rails 中使用它,money-rails gem 是一个快速的解决方案。但是,您不需要使用此 gem,也不需要使用 money gem,特别是如果您的需要仅限于该特定模型和基本操作。

这是你的选择。但是,您应该真正以整数表示金额。至于货币,您可以使用简单的 varchar 字段并使用 3 字符标准表示。