Rails 十进制在 API 中以字符串形式返回

jed*_*edi 1 ruby-on-rails

我的数据库中有一个名为“价格”的字段,它是一个小数字段,在我的 JSON API 响应中,它以字符串形式返回。

我想对字段应用一些验证,该字段在句号后最多允许 2 位数字,并发现如果我使用小数字段,我可以在数据库级别应用精度。

t.decimal "price", precision: 10, scale: 2

然后我想计算服务对象中的总价格:

服务/统计/monthly_rides_generator.rb

class CurrentMonthRidesGenerator
    def initialize(current_user)
      @current_user = current_user
    end

    def call
      user_current_month_rides_by_day.map do |date, rides_on_day|
        {
          day: formatted_date(date),
          total_distance: total_distance(rides_on_day),
          avg_ride: avg_ride(rides_on_day),
          avg_price: avg_price(rides_on_day),
          total_price: total_price(rides_on_day)
        }
      end
    end

    ...

    def total_price(rides)
      rides.map(&:price).sum
    end
  end
Run Code Online (Sandbox Code Playgroud)

应用程序/api/统计/stats_api.rb

get '/current_month' do
  Statistics::CurrentMonthRidesGenerator.new(current_user).call
end
Run Code Online (Sandbox Code Playgroud)

但在 API 响应中,该字段是一个字符串。

{
    "day": "November, 8th",
    "total_distance": "9km",
    "avg_ride": "9km",
    "avg_price": "100.0PLN",
    "total_price": "100.0"
}
Run Code Online (Sandbox Code Playgroud)

我希望该字段在保存时返回,因为我需要在前端使用浮点/十进制数,然后进行其他计算。

为什么它是十进制字段时返回字符串?我该如何修复它?

Jim*_*ker 5

它以字符串形式返回,因为 ruby​​ 中的 Decimal/BigDecimal 是一个非常精确的数字。Javascript/JSON 没有像 ruby​​ 的 BigDecimal 一样精确的数据类型。

如果打开控制台,您可以在浏览器中轻松看到这一点: 在此输入图像描述

如果您在序列化程序中将该值转换为浮点型,那么它将是 API 返回的 JSON 对象中的浮点型,但您需要注意客户端如何使用此数据。如果他们不使用可以处理精度的库,那么您将出现舍入错误,并且计算结果通常会偏差一分钱。

我一直在使用decimal.js 库来完成类似的事情,效果非常好。https://github.com/MikeMcl/decimal.js/