如何使用Rails Money gem处理美元金额而不是美分?

时间:2018-02-12 05:09:37

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

我正试图让money-rails gem工作,我遇到了问题......

其他类似的stackoverflow问题已有6年历史。

以下是我在相应专栏中提供的产品:

class Transactions < ActiveRecord::Base
  belongs_to :user, optional: true
  validates :trans_id, uniqueness: true

  monetize :price_cents

end

我已经在我的Gemfile中获得了gem,并成功运行了bundle install。

当我创建一个新项目并用pry查看它时,

create(vendor:"foo",amount:2.6,trans_id:'123cccc')
 id: nil,
 vendor: "foo",
 amount_cents: 260,
 amount_currency: "USD",
 trans_id: "123cccc",
 tax_cents: 150,
 total_cents:410,
  1. 如何以美元金额使用它?即我想将amount_cents添加到total_cents的tax_cents中。金额2.60而不是amount_cents:260,
  2. 我是否需要添加'composed_of'?
  3. 另外,为什么命名是分?我认为它应该被删除,因为模糊的文档说明:
  4.   

    在这种情况下,通过从列名中删除_cents后缀来自动创建money属性的名称。

1 个答案:

答案 0 :(得分:0)

  1. 美分问题
  2. money gem以美分存储金额,在表定义中,2个字段将定义属性。

    例如,考虑在amount中使用属性Transaction。在schema.rb中,您会找到2个字段:amount_centsamount_currency

    所以,现在你将拥有一个带有货币对象的transaction.amount。 有钱对象你可以:

    • 使用money_rails helpers中的humanized_money @money_object显示格式化的金额
    • 您可以执行操作,例如加法,减法,甚至转换为其他货币

    3)'自动属性'

    进行迁移:

    class AddAmountToClient < ActiveRecord::Migration
      def change
        add_monetize :clients, :amount
      end
    end
    

    迁移后,您可以在schema.rb

    中找到
    create_table "clients", force: :cascade do |t|
      t.integer  "amount_cents", limit: 8, default: 0,     null: false
      t.string   "amount_currency", default: "USD", null: false
    end
    

    对于attribute is created automagically by removing the _cents说的是什么,这意味着您可以从amount类访问Client属性,client.amount有一个货币对象。