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

时间:2016-01-09 13:46:10

标签: ruby-on-rails ruby database rails-activerecord currency

我有一个数据库表成本,列数量和货币。我搜索将货币保存到此列的解决方案。

您的建议是什么:列货币的哪种数据类型以及我应该保存哪些值(iso-code,货币符号......)?或者也许在ruby中已经存在像java中的数据类型货币?

2 个答案:

答案 0 :(得分:3)

以下是所有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?

这将返回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, ...)

答案 1 :(得分:2)

通常,您将金额保存为整数,因为floating point are known to have rounding errors绝对不适合代表金钱。

因为钱可以有分数,所以整数代表以分为单位的金额是很常见的,这样你就可以轻松地对金额执行操作,然后除以/100以获得价值为美元。

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

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

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