値が1456299399553483799のモデルのBigintカラムは、as_jsonを実行すると1456299399553483800のようなものに変換されます。as_jsonが切り捨てられたRails bigint
切り捨てを避けるためにbigintをシリアル化するときに、数値を文字列に変換する簡単な方法はありますか?
値が1456299399553483799のモデルのBigintカラムは、as_jsonを実行すると1456299399553483800のようなものに変換されます。as_jsonが切り捨てられたRails bigint
切り捨てを避けるためにbigintをシリアル化するときに、数値を文字列に変換する簡単な方法はありますか?
一つの可能な解決策は - 私は初期化子として、次のコードを追加:
# 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?参照)
これは興味深いです。あなたが何かを見つけたら分かち合う。 –