3021: Use Oj to encode API responses, and to decode them in tests.
authorTom Clegg <tom@curoverse.com>
Sat, 10 Jan 2015 07:55:55 +0000 (02:55 -0500)
committerTom Clegg <tom@curoverse.com>
Wed, 14 Jan 2015 05:57:29 +0000 (00:57 -0500)
commit1974e0e333395ee3eccedc2410441a7b018187da
treee07914032a8b2ee2de2450b46f17e6995af6a18a
parentf4cd3a9893e2f4a0b6fffcd6824a422e3d603b96
3021: Use Oj to encode API responses, and to decode them in tests.

* We use the Oj and multi_json gems, which makes Oj the default JSON
  parser. However, Rails' ActiveRecord::Base overrides this and uses
  the native JSON parser, which is slow. In our case we have two
  render() calls that represent nearly all cases where we ask
  ActiveRecord to serialize for us. In both cases we already have a
  hash (not a model object), and we always want JSON responses. So we
  can fix the performance problem simply by calling Oj.dump()
  ourselves, and passing the resulting JSON (instead of the hash) to
  render().

More gory details:

* "ActiveRecord::Base.extend kills JSON performance":
  https://github.com/rails/rails/issues/9212

* "when freedom patches fight, nobody wins":
  https://github.com/intridea/multi_json/pull/138#issuecomment-24468223
services/api/app/controllers/application_controller.rb
services/api/test/test_helper.rb