【问题标题】:How do I work with dollar amounts not cents with Rails Money gem?我如何使用 Rails Money gem 处理美元而不是美分?
【发布时间】:2018-02-12 05:09:37
【问题描述】:

我正在尝试让 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。

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

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. 如何处理美元金额? IE。我想为 total_cents 将 amount_cents 添加到 tax_cents。金额 2.60 而不是 amount_cents: 260,
  2. 是否需要添加“composed_of”?
  3. 另外,为什么命名中要使用“cent”?我认为它应该被删除,因为模糊的文档指出:

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

【问题讨论】:

  • 金钱宝石在内部使用美分。这些存储在带有_cents 后缀的属性中。 gem 然后创建没有_cents 后缀的访问器方法(getter 和setter)(因此“删除”)。例如:amounttaxtotal。有关示例,请参见 method conversion

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


【解决方案1】:
  1. 美分问题

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

例如,考虑在Transaction 中拥有属性amount。在schema.rb 中,您会找到两个字段: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 的含义是,您可以通过 Client 类访问 amount 属性,而 client.amount 具有金钱对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2019-09-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多