money-rails gem列命名约定

时间:2017-12-13 17:21:17

标签: ruby-on-rails ruby postgresql currency money-rails

我的Order模型包含unit_pricediscount_pricefinal_price等。 integer db中的所有字段都是postgres个字段。目前它的舍入量为下一个整数并保存。但现在我发现这不是一个好方法,因为它可能会在将来导致一些错误/问题。所以我 计划通过做(USD*100)来节省金钱价值,但是当显示时通过写一些帮助者以英镑显示它。

但我现在发现这个宝石money-rails可以做我想要的。我试图围绕这个宝石,但我真的不知道这里使用的一些惯例也不确定它适合我的目的

我的默认货币为GBP

我可以看到这个gem默认使用约定_cents

monetize :price_cents #from docs

上面假设一个db列price_cents。 这里为什么我们应该使用美分作为静态列?那是什么意思?除了在这里明确任何其他用途?

如果用于cents的目的,它会自动查找USD,如果penny查找GBP& soforth ...然后对于我们的应用程序支持的每种货币,我们将最终创建新的数据库列,如price_pennyprice_cent等。如果有很多货币,那就不是那么好了。或者我可以在这里使用通用名称,例如price_smallest,并使用它而不管当前类型?  还

我无法在这里找到确切的用例。有人能否对这个话题有所了解?

  

注意:我的应用目前没有支持其他货币的计划。   但是可以在将来添加。很高兴考虑到现在我想..

1 个答案:

答案 0 :(得分:0)

因此您需要从表格订单中删除列unit_price,discount_price,final_price。并使用add_monetize正确添加它们。

创建一个如下所示的新迁移文件:

class FixPricesInOrders < ActiveRecord::Migration[5.0]
  def change
    # Remove Columns
    remove_column :orders, :unit_price
    remove_column :orders, :discount_price
    remove_column :orders, :final_price
    # Add money
    add_monetize :orders, :unit_price
    add_monetize :orders, :discount_price
    add_monetize :orders, :final_price
  end
end

来自https://github.com/RubyMoney/money-rails

“由于在Rails 4.2中为PostgreSQL添加了money列类型,您需要使用add_monetize而不是add_money列。”

然后确保将以下内容添加到app/models/order.rb

monetize :unit_price
monetize :discount_price
monetize :final_price