【问题标题】:Cannot get exact value on parameter无法获得参数的准确值
【发布时间】:2016-03-17 07:40:49
【问题描述】:

我有下面的示例参数:

Parameters: {
          "utf8"=>"✓",
          "authenticity_token"=>"xxxxxxxxxx",
          "post" => {
              "product_attributes" => {
                  "name"=>"Ruby",
                  "product_dtls_attributes" => {
                      "0"=>{"price"=>"12,333.00"},
                      "1"=>{"price"=>"111,111.00"}
                  },
              },
          "content"=>"Some contents here."
        }

现在的情况是,我无法在model 中获得price 的确切值。

代替:

  1. 价格 = 12,333.00
  2. 价格 = 111,111.00

我明白了:

  1. 价格 = 12.00
  2. 价格 = 11.00

现在这是我在代码中所做的:

before_validation(on: :create) do
  puts "price = #{self.price}" # I also tried self.price.to_s, but didn't work.
end

更新:

(我在这里尝试获取full value 并去掉逗号)。

before_validation(on: :create) do
  puts "price = #{self.price.delete(',').to_f}" # I also tried self.price.to_s, but didn't work.
end

注意:

price 列是浮动的

问题是,我怎样才能得到参数price 的确切值。 谢谢!

【问题讨论】:

  • @VtrKanna,我正在尝试获取整个值而不是四舍五入之类的。但是,那谢谢。
  • 不,你没有得到我想要做的。它不在解析中。它正在获得price 的全部价值。
  • 您是否尝试过在控制器中获取准确的值并将参数传递给您的模型?

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 activerecord


【解决方案1】:

查看您提供的“价格”参数:

"price"=>"12,333.00"

问题在于逗号。

例如:

irb(main):003:0> "12,333.00".to_i
=> 12

但你可以解决这个问题:

例子:

irb(main):011:0> "12,333.00".tr(",", "_").to_i
=> 12333

关键点是将逗号替换为下划线。原因是12_33312333 是同一个整数(下划线被忽略)。您也可以使用 tr(",", "") 删除逗号。在这种情况下,您可以将tr 替换为gsub 并具有相同的效果。

顺便问一下,您是否知道您的验证方法除了打印之外没有任何作用?无论如何,before_validation 方法在这里不是正确的方法,因为当代码到达这一点时,数字已经被错误地转换了。相反,您可以覆盖模型上的设置器:

class MyModel
  def price=(new_price)
    if new_price.is_a?(String)
      new_price = new_price.tr(",", "")
    end 
    super(new_price)
  end
end

【讨论】:

  • 这没有得到price的全部价值。
  • 我不知道你的 Rails 应用程序的其余部分发生了什么,但重写模型设置器以删除逗号是这个的要点。您应该能够在 Rails 控制台中对其进行测试。此外,在不提供任何进一步信息的情况下发表评论说它不起作用是没有成效的。
【解决方案2】:

你也可以这样做:

2.1.1 :002 > "12,333.00".gsub(',', '').to_f
 => 12333.0

这将替换逗号,如果你有任何十进制值,它也会解释它:

2.1.1 :003 > "12,333.56".gsub(',', '').to_f
 => 12333.56 

【讨论】:

  • 问题不在于去除逗号。但是要获得price 的全部价值。我只更新了这个问题,因为我猜@user1934428 没有得到我想要做的事情。
  • 那么您没有使用上述内容吗?它将替换逗号,当您执行 to_f 时,它会将其更改为 float 而不会丢失任何值。还缺少什么?
【解决方案3】:

我提出的解决方案是在控制器上处理它。迭代哈希然后保存它。然后它得到我想要得到的正确值并保存正确的值。

迭代以下哈希并保存。

"post" => {
          "product_attributes" => {
              "name"=>"Ruby",
              "product_dtls_attributes" => {
                  "0"=>{"price"=>"12,333.00"},
                  "1"=>{"price"=>"111,111.00"}
              },
          },
      "content"=>"Some contents here."

由于逗号分隔符,我无法在模型中获得 price 的完整值。这个逗号分隔符和小数点+小数位是gem制作的。

【讨论】:

    【解决方案4】:

    价格是浮动的,但您的数据包含非数字字符(逗号、“,”)。当字段转换为浮点数时,解析可能会在此字符处停止并仅返回 12。

    不过,我预计会引发错误。

    我建议您在将逗号放入数据库之前删除它。

    【讨论】:

    • 是的,这就是为什么我想在验证和保存之前去掉它。我将更新我的代码以明确我应该做什么。
    • 我不知道您正在寻求如何删除逗号的帮助,因为您在原始帖子中没有提及这一点。我以为你只想知道,为什么你会得到结果。 ...我想知道为什么我的回复(至少就您的原始帖子而言,似乎是正确的)被否决了。
    • 还有一点:如果你想要 exact 值,将数据库中的数字定义为 float 是否明智?根据定义,这只是一个近似值。在 Ruby 中,您可以使用任意精度的十进制算术。也许你应该考虑使用 type :decimal。另请参阅here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多