我有一个数据库表成本,列数量和货币。我搜索将货币保存到此列的解决方案。
您的建议是什么:列货币的哪种数据类型以及我应该保存哪些值(iso-code,货币符号......)?或者也许在ruby中已经存在像java中的数据类型货币?
答案 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标准表示。