【问题标题】:Ruby on Rails: A way to save currency into a column within a database-tableRuby on Rails:一种将货币保存到数据库表中的列中的方法
【发布时间】:2016-01-09 13:46:10
【问题描述】:

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

您有什么建议:货币列的哪种数据类型以及我应该在那里保存哪些值(iso 代码、货币符号...)?或者也许在 ruby​​ 中已经有一个数据类型 Currency 像在 java 中一样?

【问题讨论】:

  • 这个问题已经讨论过here。希望对您有所帮助。
  • 确实,他们讨论了如何在使用 number_to_currency 在视图中显示货币时处理货币,但我的问题是找到一种实用的方法来将货币保存到数据库表中。

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


【解决方案1】:

这里是所有 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?

这将根据值返回真或假。

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

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) 的东西。假设已经有红宝石级货币。
  • 您永远不应该将金额保存为浮点数,因为您可能会在计算过程中失去精度。
  • @SimoneCarletti 是十进制更好的选择吗?
  • 你是对的,最终你会得到奇怪的值..我编辑为十进制
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2011-11-28
    • 2016-07-08
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多