: O. Yuanying

続 ActiveRecord::Baseのto_jsonメソッド

ActiveRecord::Baseのto_jsonメソッドが気にくわないというエントリを以前書いたが、つい最近Agile Web Developmentで紹介されていたJsonifierがいい感じ。

Jsonifier is a Rails plugin that adds options to the ActiveRecord#to_json method similar to ActiveRecord#to_xml. It's time to treat the JSON encoding of AR objects with more respect ;)

Jsonfier は ActiveRecord#to_xml に似た ActiveRecord#to_json メソッドにオプションを追加する Rails プラグインです。今こそ、AR オブジェクトの JSON へのエンコーディングにもっと尊敬を込めた取り扱いを行う時です^^;

このプラグインを導入することで、

属性の値が attributes でくるまれなくなる

例えば、

{attributes: {id: 1, name: "Konata"}}

って返ってた JSON 文字列が、

{id: 1, name: "Konata"}

って返るようになる。ってか "Konata" って^^;

他には、to_json メソッドにいくつかのオプションを渡せるようになる。

:only, :except

david.to_json(:only => :name)                 # {name: "David"}
david.to_json(:only => [:id, :name])          # {id: 1, name: "David"}
david.to_json(:except => :created_at)         # {id: 1, name: "David", awesome: true}
david.to_json(:except => [:id, :created_at])  # {name: "David", awesome: true}

これはそのまんまですな。

:method

david.to_json(:methods => :permalink)
  # {id: 1, name: "David", awesome: true, created_at: "07/01/2007", permalink => "1-David"}
david.to_json(:methods => [:permalink, :interestingness])
  # {id: 1, name: "David", awesome: true, created_at: "07/01/2007", \
    permalink => "1-David", :interestingness => 666}

メソッドの返り値を含めるらしい。これは面白い。

:include

その AR オブジェクトの関連を含めるオプション。

david.to_json(:include => :posts)
    # {id: 1, name: "David", awesome: true, created_at: "07/01/2007", \
         posts: [{id: 1, author_id: 1, title: "Welcome to the weblog"}, \
                 {id: 2, author_id: 1, title: "So I was thinking"}]}

感想

けどぶっちゃけ、:method オプション以外のオプションは ActiveRecord でオブジェクトをとってくる時に find のオプションで代用が効くと思うんだよな。