Ruby on Rails добавляет метод "as_json" ко многим распространенным классам, который превращает объекты ActiveRecord в хеш-объекты, которые затем можно отправлять в сериализатор JSON. Недавно я столкнулся с ошибкой в моем коде, связанной с этим методом, и он обрабатывает логические значения.
Я могу кратко изложить ошибку:
{"foo" => true}.as_json
Я ожидаю, что этот метод вернет идентичный хеш. Вместо этого он возвращает
{"foo" => "true"}
Похоже, что это предусмотрено проектом, согласно строке 157 в encoding.rb
AS_JSON = ActiveSupport::JSON::Variable.new('true').freeze
Могу ли я спросить, почему rails возвращает строковое значение "true" вместо того, чтобы сохранять его как истинное логическое значение?
Моя ошибка заключается в следующем: я храню сериализованные объекты JSON в кэше. Когда я вытаскиваю их из кэша, я оставляю их как хэши, чтобы избежать ненужной десериализации объектов. Если я не нахожу его в кеше, я вытаскиваю объект из базы данных и вызываю на нем as_json. Я ожидаю, что то, что я извлекаю из кэша и что я получаю из as_json, будет идентичным. Это не так, потому что из кеша выходит {"foo" => true}, а из as_json возвращается {"foo" => "true"}