【问题标题】:money-rails gem column naming conventionsmoney-rails gem 列命名约定
【发布时间】:2017-12-13 17:21:17
【问题描述】:

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

但我现在找到了这个宝石money-rails,它可以做我想做的事。我正试图围绕这个宝石转转,但我无法真正弄清楚这里使用的一些约定,也不确定它是否适合我的目的

我的默认货币是GBP

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

monetize :price_cents #from docs

以上假设有一个 db 列 price_cents。 这里为什么要使用 cents 作为静态列?这样做的目的是什么?除了在这里明确之外还有其他用途吗?

如果它用于cents 之类的目的,它会自动查找USD,如果penny 查找GBP 等...那么对于我们的应用支持的每种货币,我们最终将创建新的数据库列,例如@987654339 @、price_cent 等。如果有很多货币,这不是很好。或者我可以在这里使用一个通用名称,比如 price_smallest 并且不管货币类型如何都可以使用它? 还有

我无法正确找出确切的用例。有人可以对这个话题有所了解吗?

注意:我的应用现在没有支持其他货币的计划。 但将来可能会添加。太好了,现在我认为..

【问题讨论】:

  • 它似乎适用于inference purposes,例如monetize :price,默认配置将假定price_centsprice_currency。您可以看到“_cents”是default configurationamount 列的默认后缀。
  • 由于默认货币是“美元”,而美分是美国货币体系中最小的面额,因此将其作为后缀是最有意义的。话虽这么说,它不需要是美分,但不需要按货币类型分隔,这只是一种约定,可以根据您认为合适的方式配置为“_cents”列或您选择的任何名称将包含基于货币的子单位值。例如cents 的 subunit_to_unit 为 100,因为整体有 100 美分
  • This Spec Test 清楚地表明您可以在哪里看到以美元计的美分预计为 2,000,000,但在 CLP(其 subunit_to_unit 为 1)中,“美分”预计与金额 20,000
  • @engineersmnky 谢谢你说清楚。请提供答案,以便我接受。

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


【解决方案1】:

因此,您需要从订单表中删除列 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 添加了货币列类型,您将需要使用 add_monetize 而不是 add_money 列。”

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

monetize :unit_price
monetize :discount_price
monetize :final_price

【讨论】:

  • 感谢您的回答。但这不是查询。我的查询是关于我提到的约定的原因以及它如何在我的情况下帮助我。抱歉,如果问题不清楚。
  • 您的数据库中有错误的列。一旦你解决了这个问题,它就会为你工作。
猜你喜欢
  • 2015-08-29
  • 2012-02-16
  • 2011-09-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多