The docs suggest overriding ActiveSupport's implementation of Hash#to_json 
and Array#to_json.

I've been trying to figure out why the suggested method of overriding the 
methods doesn't work for me:

class Array
  def to_json(options = {})
    JSON.generate(self)
  end
end


class Hash
  def to_json(options = {})
    JSON.generate(self)
  end
end



Turns out ActiveRecord is using Class#prepend to define those methods 
instead of just overriding them, so even if you override the methods with 
your own definitions in an initializer, they won't be called:

module ActiveSupport
  module ToJsonWithActiveSupportEncoder # :nodoc:
    def to_json(options = nil)
      if options.is_a?(::JSON::State)
        # Called from JSON.{generate,dump}, forward it to JSON gem's to_json
        super(options)
      else
        # to_json is being invoked directly, use ActiveSupport's encoder
        ActiveSupport::JSON.encode(self, options)
      end
    end
  end
end

[Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, 
TrueClass, Enumerable].reverse_each do |klass|
  klass.prepend(ActiveSupport::ToJsonWithActiveSupportEncoder)
end

So I've countered with my own prepend:

module FixJson
  def to_json(options = {})
    JSON.generate(self)
  end
end

Array.prepend(FixJson)
Hash.prepend(FixJson)

And that seems to work. 

Before, for a dataset .to_json I was getting:

 
"[{\"json\":\"{\\\"id\\\":1,\\\"name\\\":\\\"sdfasdf\\\",\\\"template\\\":null,\\\"cumulative\\\":true,\\\"required_weekly\\\":true,\\\"in_house\\\":false,\\\"created_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\",\\\"updated_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\"}\
"},{\
"json\":\"{\\\"id\\\":2,\\\"name\\\":\\\"sdafsd\\\",\\\"template\\\":null,\\\"cumulative\\\":true,\\\"required_weekly\\\":true,\\\"in_house\\\":false,\\\"created_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\",\\\"updated_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\"}\"},{\
"json\
":\"{\\\"id\\\":5,\\\"name\\\":\\\"sadfsaedf\\\",\\\"template\\\":null,\\\"cumulative\\\":true,\\\"required_weekly\\\":true,\\\"in_house\\\":true,\\\"created_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\",\\\"updated_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\"}\
"},{\
"json\":\"{\\\"id\\\":6,\\\"name\\\":\\\"sdfsad\\\",\\\"template\\\":null,\\\"cumulative\\\":true,\\\"required_weekly\\\":true,\\\"in_house\\\":true,\\\"created_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\",\\\"updated_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\"}\"}
,{\"json\":\"{\\\"id\\\":4,\\\"name\\\":\\\"sdafasd\\\",\\\"template\\\":null,\\\"cumulative\\\":true,\\\"required_weekly\\\":true,\\\"in_house\\\":true,\\\"created_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\",\\\"updated_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\"}\"},{\
"json\
":\"{\\\"id\\\":3,\\\"name\\\":\\\"sadfsd\\\",\\\"template\\\":null,\\\"cumulative\\\":true,\\\"required_weekly\\\":true,\\\"in_house\\\":false,\\\"created_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\",\\\"updated_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\"}\"},{\"json
\":\"{\\\"id\\\":7,\\\"name\\\":\\\"sadfsda\\\",\\\"template\\\":null,\\\"cumulative\\\":false,\\\"required_weekly\\\":true,\\\"in_house\\\":false,\\\"created_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\",\\\"updated_at\\\":\\\"2020-03-20T19:46:54.933-04:00\\\"}\"}]"


Now, I get:
"[{\"id\":1,\"name\":\"sadfasd\",\"template\":null,\"cumulative\":true,\"required_weekly\":true,\"in_house\":false,\"created_at\":\"2020-03-20
 
19:46:54-0400\",\"updated_at\":\"2020-03-20 19:46:54 
-0400\"},{\"id\":2,\"name\":\"asdfdas\",\"template\":null,\"cumulative\":true,\"required_weekly\":true,\"in_house\":false,\"created_at\":\"2020-03-20
 
19:46:54 -0400\",\"updated_at\":\"2020-03-20 19:46:54 
-0400\"},{\"id\":5,\"name\":\"sadfasdf\",\"template\":null,\"cumulative\":true,\"required_weekly\":true,\"in_house\":true,\"created_at\":\"2020-03-20
 
19:46:54 -0400\",\"updated_at\":\"2020-03-20 19:46:54 
-0400\"},{\"id\":6,\"name\":\"sadfds\",\"template\":null,\"cumulative\":true,\"required_weekly\":true,\"in_house\":true,\"created_at\":\"2020-03-20
 
19:46:54 -0400\",\"updated_at\":\"2020-03-20 19:46:54 
-0400\"},{\"id\":4,\"name\":\"sadfsdf\",\"template\":null,\"cumulative\":true,\"required_weekly\":true,\"in_house\":true,\"created_at\":\"2020-03-20
 
19:46:54 -0400\",\"updated_at\":\"2020-03-20 19:46:54 
-0400\"},{\"id\":3,\"name\":\"asdfsd\",\"template\":null,\"cumulative\":true,\"required_weekly\":true,\"in_house\":false,\"created_at\":\"2020-03-20
 
19:46:54 -0400\",\"updated_at\":\"2020-03-20 19:46:54 
-0400\"},{\"id\":7,\"name\":\"asdfads\",\"template\":null,\"cumulative\":false,\"required_weekly\":true,\"in_house\":false,\"created_at\":\"2020-03-20
 
19:46:54 -0400\",\"updated_at\":\"2020-03-20 19:46:54 -0400\"}]"

(with obfuscated names :)

Took me some time to figure out. Should the docs be updated?

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sequel-talk/4e82dec1-4392-4873-93e7-a934280fe7be%40googlegroups.com.

Reply via email to