at backyard

Color my life with the chaos of trouble.

Railsで複数テーブルのjsonデータを一度に返したい。

Railsのrender jsonを用いて、複数テーブルのjsonデータを返す方法。

調べてもぱっと出てこなかったので、一応メモとしておく。
(そもそも常識なのかもしれない)
そのため、あくまで個人的な備忘録の意味が強い。

最近RailsAPIを作っているのだが、"render json"で複数の関連テーブルを
1つのjsonとして返したかったので、そのやり方をメモ。

"posts"というテーブルに関連する"comments"と"images"データも一緒に返したいときは、
下記のようにrenderメソッドに記載する。
("@posts"にはpostsデータが入っているものとする。

respond_to do |f|
  f.json { render json: @posts.to_json(:include => [:comments, :images]) }
end


また、関連しないテーブルの情報を"render json"で一度に返すときは下記のようにした。

respond_to do |f|
  f.json { render json: [@posts.to_json(:include => [:comments, :images]), [user: @user.to_json]] }
end

# または

respond_to do |f|
  f.json { render json: [posts: @posts.to_json(:include => [:comments, :images]), user: @user.to_json] }
end

これで希望する情報をjson形式で返せる。
のだけど、あまりこういうやり方が検索情報で出てこなかったので、
rails的にありなのかはいまいち自信が持てない。


※一応、このポストを行う前に同じケースを今一度探してみたが、
たぶんこのstack overflowの記事が該当する気がする。

stackoverflow.com

追記

上記のやり方で出力した場合、postsデータはjson文字列となって出力されるが、
(js側で一度JSON.parseをする必要がある)
下記のようにして取得すると、そのままオブジェクトとして取得できる。個人的なメモとして残しておく。

# postとuserをそれぞれオブジェクトとして取得
respond_to do |f|
  f.json { render json: {posts: @posts, user: @user }}
end