2017-02-23 3 views
0

値が1456299399553483799のモデルのBigintカラムは、as_jsonを実行すると1456299399553483800のようなものに変換されます。as_jsonが切り捨てられたRails bigint

切り捨てを避けるためにbigintをシリアル化するときに、数値を文字列に変換する簡単な方法はありますか?

+2

これは興味深いです。あなたが何かを見つけたら分かち合う。 –

答えて

0

一つの可能​​な解決策は - 私は初期化子として、次のコードを追加:

# config/initializers/bigint_serializer.rb 

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

をこれはhttps://github.com/rails/rails/blob/v5.1.4/activesupport/lib/active_support/core_ext/object/json.rb#L95からNumeric#as_jsonのデフォルトの動作をオーバーライドして、4バイトの符号付きmaxよりも大きい数字で結果がになってされているintです文字列。

文字列に切り替える前に、より大きなint値で実際にokになっていることを確かめていますが、おそらく9007199254740991ですが、それよりも小さいintsを必要としないので、最大4バイトintとして残しましたints(What is JavaScript's highest integer value that a Number can go to without losing precision?参照)

関連する問題