Edited at

RailsでControllerだけでアソシエーションがあるModelの結果をjsonの応答で返す方法

意外とバチっとハマる記事がなかったので、投稿。

JavascriptでAjax的な処理を書こうとするとviewを書くほどでもないActiveRecordの結果をjsonで返す処理はよく書くと思う。

特に自分の場合、複雑なGUIをJavascriptでやろうとすると必ずd3.jsを使って解決しようとしてしまうので、様々な処理をしながらもレスポンスは常にすべてのデータを返す、みたいな実装をしがちだ。

普通に検索すると以下のようなコードが見つかる。

@items = Model.all

render :json => @items

これはこれでいいのだが、belongs_toとか関連付けのあるModelの関連のModelまで取得しようと思うとなかなかピンポイントの記事がない。

結果としては、as_jsonを使うと思った通りの結果になった。

to_jsonはよくデータ出てくるのだが、いったん文字列になってしまうため、またjsonに戻さないといけない。

ということで相手のModelのidとtitleだけほしいみたいな場合は、以下のように書けばよかった。

ars = Model1.eager_load(:model2)

@items = ars.as_json(:include => {:model2 => {:only => [:id, :title]}})
render :json => @items