使用as_json截断的Rails bigint

时间:2017-02-23 05:51:15

标签: ruby-on-rails json activerecord

通过as_json运行时,值为1456299399553483799的模型中的Bigint列会转换为类似于1456299399553483800的内容。

是否有一种简单/内置的方法可以在序列化bigint时将数字转换为字符串以避免截断?

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案 - 我将以下代码添加为初始化程序:

# config/initializers/bigint_serializer.rb

class Integer
  def as_json(options = nil)
    self > 2147483647 ? self.to_s : self
  end
end

这将覆盖Numeric#as_json的{​​{1}}的默认行为,并导致大于4字节有符号max int的数字被转换为字符串。

注意,我很确定你在切换到一个字符串之前确实可以使用更大的int值 - 也许是9007199254740991但是我把它保留为最大的4字节int,因为我没有'需要更小的整数(见https://github.com/rails/rails/blob/v5.1.4/activesupport/lib/active_support/core_ext/object/json.rb#L95