【Rails】リレーションを張った2つのテーブルのJSONをまとめて取得
個人練習でTwitterもどきを作っていた時に、リレーションを張った2つのテーブル(TweetsテーブルとUsersテーブル)のJSONをまとめて取得したい時があった。一度知ってしまえば記述はシンプルなのに、最初は調べてもなぜかすぐにはヒットしなかったので、まとめ。
before
tweets_controller.rb
def index tweets = Tweet.all.where(user_id: current_user.id) respond_to do |format| format.html # 通常のURLの場合、index.html.erb が返される format.json { render json: tweets.to_json } # URLが.jsonの場合、tweets.to_json が返される end end
index.json
[ { "id": 1, "user_id": 1, "tweet": "テストだよ", "created_at": "2018-11-19T17:09:25.000+09:00", "updated_at": "2018-11-19T17:09:25.000+09:00" } { "id": 2, "user_id": 1, "tweet": "jsonだよ", "created_at": "2018-11-20T16:19:28.000+09:00", "updated_at": "2018-11-20T16:19:28.000+09:00", } ]
after
tweets_controller.rb
def index tweets = Tweet.all.where(user_id: current_user.id) respond_to do |format| format.html format.json { render json: tweets.to_json(:include => :user) } # (:include => :user)を追加 end end
index.json
[ { "id": 1, "user_id": 1, "tweet": "テストだよ", "created_at": "2018-11-19T17:09:25.000+09:00", "updated_at": "2018-11-19T17:09:25.000+09:00", "user": { id: 1, user_name: "ほげ" } } { "id": 2, "user_id": 1, "tweet": "jsonだよ", "created_at": "2018-11-20T16:19:28.000+09:00", "updated_at": "2018-11-20T16:19:28.000+09:00", "user": { id: 1, user_name: "ほげ" } } ]
こうすればtweets.user.user_name
でuser_name
が取得できる。
参考文献
万一間違いがあった場合はコメント欄よりご指摘ください。