Railsのserializerの導入方法と使い方を紹介!

Ruby

今回はRuby on Railsのserializerというgemについて紹介します。

serializerとは?

serializerは簡単に説明すると、データをjson形式にまとめられるgemです。

例えば、以下のようなjsonを簡単に作成することができます。

[ { "id": 1, "name": "闇の魔術", "author": { "id": 1, "name": "佐藤" } }, { "id": 2, "name": "炎の書", "author": { "id": 2, "name": "山田" } }, { "id": 3, "name": "雷の書", "author": { "id": 2, "name": "山田" } } ]
クローバー
クローバー

Railsをapiとして利用する場合はよく利用するかもね!

serializerの導入方法

gem 'active_model_serializers'
bundle install

serializerの設定方法

serializerを導入することができたら次は設定していきます。

serializerのファイル作成

rails g serializer モデル名

例えば、Booksモデルのserializerを使いたい場合は、以下のように記載します。

rails g serializer Book

上記のものをターミナルで叩くと、`app/serializers/book_serializer.rb`というパスが自動で生成されます。

serializerの中身を設定

serializerの中身を記載する前に、前提として以下のテーブルが存在するとします。

create_table "authors", force: :cascade do |t|
  t.string "name"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "books", force: :cascade do |t|
  t.string "name"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.bigint "author_id"
  t.index ["author_id"], name: "index_books_on_author_id"
end

BookテーブルとAuthorテーブルがあります。

関係は1対多です。

Bookだけ出力してみる

ではまずBookだけを出力してみます。

app/serializers/book_serializer.rbを以下のように設定していきます。

class BookSerializer < ActiveModel::Serializer
  attributes %i[id name]
end

attributesにはjsonとして出力するカラムを記載しています。

今回のBooksテーブルには、id、name、created_at、updated_atがありますが、その中からidとnameだけjsonで出力するように設定します。

次にcontrollerを設定します。

class BooksController < ApplicationController
  def index
    books = Book.all
    render json: books, each_serializer: BookSerializer
  end
end

render json: books, each_serializer: BookSerializerと記載することで、serializerで設定したjsonを出力することができます。

そして、http://localhost:3000/booksにアクセスすると以下のjsonが返ってきました。

[ { "id": 1, "name": "闇の魔術" }, { "id": 2, "name": "炎の書" }, { "id": 3, "name": "雷の書" } ]

BookとAuthorの関係を出力してみる。

BookとAuthorの関係は1対多ですが、この関係ごと出力したい場合もあるでしょう。

そんな時は、serializerを以下のように設定します。

class BookSerializer < ActiveModel::Serializer
  attributes %i[id name]

  belongs_to :author,  serializer: AuthorSerializer
end
class AuthorSerializer < ActiveModel::Serializer
  attributes %i[id name]

  has_many :books, serializer: BookSerializer
end

controllerは上記のものと同様で構いません。

その出力結果が以下のようになります。

[ { "id": 1, "name": "闇の魔術", "author": { "id": 1, "name": "佐藤" } }, { "id": 2, "name": "炎の書", "author": { "id": 2, "name": "山田" } }, { "id": 3, "name": "雷の書", "author": { "id": 2, "name": "山田" } } ]
クローバー
クローバー

リレーションごと取得できたね!

所感

今回はserializerを使ってみました。

RailsをAPIとして利用している場合はほぼほぼ使うgemなのかなと思うので、慣れておくと便利かなと思います。

ぜひ参考に!

コメント