【问题标题】:Rails Amounts in Thousands Are Truncated以千计的 Rails 数量被截断
【发布时间】:2017-08-29 23:31:46
【问题描述】:

在我的 Rails 5 应用程序中,我阅读了产品的提要。在 JSON 中,当价格超过 1,000 美元时,JSON 中有一个逗号,例如 1,000。

我的代码似乎截断了它,所以它存储为 1 而不是 1,000。

所有其他字段都正确存储。谁能告诉我我做错了什么?

在本例中,reg_price 保存为 2,而不是 2590。

json 示例(用于 reg_price 字段):

[
  {
    "reg_price": "2,590"
  }
]

架构

create_table "products", force: :cascade do |t|
  t.decimal  "reg_price",                           precision: 10, scale: 2
end

型号

response = open_url(url_string).to_s
products = JSON.parse(response)

products.each do |product|
  product = Product.new(
    reg_price: item['reg_price']
  )
  product.save
end

【问题讨论】:

    标签: ruby-on-rails json ruby


    【解决方案1】:

    你没有做错任何事。小数不适用于逗号分隔符。我不确定是否有一个很好的方法来解决这个问题。但作为一个选项,您可以定义一个虚拟属性:

    def reg_price=(reg_price)
      self[:reg_price] = reg_price.gsub(',', '')
    end
    

    【讨论】:

    • 小心这一点,因为有时价格表示为2,999可能表示 2999,2,99 表示使用欧洲符号时的 2.99。
    • Imo,reg_price.delete(',') 更直接,读起来更好。
    【解决方案2】:

    发生这种情况的原因与 Rails 无关。

    1. JSON 是一个非常简单的文档结构,不支持数字分隔符。 JSON 文档中的值是字符串。
    2. 当您收到一个字符串作为输入并希望将其存储为整数时,您需要将其转换为适当的类型。
    3. Ruby 内置了对此的支持,Rails 正在使用它:"1".to_s #=> 1
    4. Ruby 用于将字符串转换为整数的特定启发式方法是将任意数字转换为非数字字符并将其转换为整数。逗号是非数字的,至少在默认情况下,在 Ruby 中。

    解决方案是使用另一种方法将 JSON 中的字符串值转换为整数。您可以通过以下任何方式执行此操作:

    1. 在将字符串发送到 ActiveRecord 模型之前将其转换为整数。
    2. 更改字符串,使默认的 Ruby 强制转换将字符串转换为预期值。
    3. 使用自定义施法器来处理此特定属性的施法(在 ActiveRecord 和 ActiveModel 内部)。

    @Danil 提出的解决方案遵循上面的#2,它有一些缺点(正如@tadman 指出的那样)。

    在不陷入泥潭的情况下,一种更强大的处理方法是使用像 Delocalize 这样的库,它会自动处理数字字符串解析和转换,并考虑活动区域设置使用的分隔符。见this excellent answer by Benoit Garret for more information

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 2017-08-11
      • 2017-01-27
      相关资源
      最近更新 更多