【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_nameuser_nameが取得できる。

参考文献


万一間違いがあった場合はコメント欄よりご指摘ください。