: O. Yuanying

ActiveRecord::Baseのto_jsonメソッド

ActiveRecord::Baseのto_jsonメソッドが気にくわない。

というかActiveRecord::Baseクラス自体にはto_jsonメソッドは定義されていないので、ActiveSupport中におけるObjectクラスに定義されているto_jsonメソッドがコールされるため、予想していたjsonと異なるjsonが返されてしまう。

例えば、

Account.find(1).to_json

とした場合は、

"{username: \"foo\", id: \"1\", password: \"bar\"}"

って返って欲しいのが人情だと思うんだよなあ。

"{attributes: {username: \"foo\", id: \"1\", password: \"bar\"}}"

けどこう返る。attributesでくるまなくて良いですよ!!!

気にくわないのでRailsにモンキーパッチを当ててみた。

module ActiveRecord
  class Base
    def to_json
      values = instance_values
      att = values.delete('attributes') do |key|
        {}
      end
      ActiveSupport::JSON.encode(att.update(values))
    end
  end
end

ひどいソースコードだけどちゃんと動いた。よしよし。

関連エントリ