Ruby和money,在rails应用程序中,如何在db中存储货币值?

Bla*_*man 10 ruby currency ruby-on-rails

我想确保在rails应用程序中存储产品价格时没有舍入问题.

我应该使用什么mysql数据类型,以及它在rails中映射到什么?

我希望十进制的十进制精度.

Dou*_*rer 13

我更喜欢将货币存储在数据库中,作为最低面额(便士,美分等)的整数,并对此进行计算.

add_column :product, :price, :integer
Run Code Online (Sandbox Code Playgroud)

当然,您希望任何表单输入和显示都符合人们期望的形式,因此我们在模型中添加一些辅助方法来帮助解决这个问题.

class Product < ActiveRecord::Base
  def price_dollars
    self.price / 100
  end

  def price_dollars=(val)
    self.price = val * 100
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在控制台中我们得到:

> prod = Product.new
=> [snip]

> prod.price_dollars = 12.93
=> 12.93
> prod.price
=> 1293
> prod.price_dollars
=> 12.93

> prod.price = 1691
=> 1691
> prod.price_dollars
=> 16.91
Run Code Online (Sandbox Code Playgroud)

我确定可能有一个插件可以在某个地方很好地处理这个问题.

  • 你想到的插件是money gem,在`Gemfile`中添加`gem 'money'`。 (2认同)

Xav*_*olt 11

听起来你想要:decimal列类型.您可以使用:precision:scale选项控制总位数和小数位数:

add_column :mytable, :mycolumn, :decimal, :precision => 30, :scale => 10
Run Code Online (Sandbox Code Playgroud)

关于本文档中的数据类型的更多内容(不知道column函数是什么,但可能是内部的!).

希望这可以帮助!