はじめに
RailsでAPIモードを扱う時に、Active Model Serializers
もしくはjson-api-serializer
をシリアライザー
の選択肢として用いる事がほとんどかと思います。
今回はこれらのシリアライザー
について簡単に比較してみました。
シリアライズとは
オブジェクト
やデータ構造
を、ファイル
やデータベース
、ネットワーク
越しの通信でやり取りできる形式(たいていの場合は文字列)に変換することです。JSON
やXML
が挙げられます。
比較
特徴 | ActiveModel::Serializer | json-api-serializer |
---|---|---|
設計 | MVCに沿った構造で、JSON構造を細かくコントロールできる | パフォーマンスに特化しており、シンプルな定義で高速にシリアライズ可能 |
使用例 | render json: user, serializer: UserSerializer |
render json: UserSerializer.new(user).serialized_json |
開発元 | ライブラリとしての歴史が長く、広範囲にわたるRailsコミュニティによってサポートされている | アクティブなメンテナンスとFast-jsonapiの後継Gemの立ち位置で、AMSより速度が圧倒的に速い |
コードの簡潔さ | 各モデルごとに詳細なシリアライザーを書くことが多いため、コード量が増えることがある | シリアライザーの定義がシンプルで、コード量を抑えることができる |
GitHub スター数 | 約5.3k | 約1.3k |
ActiveModel::Serializer
gem 'active_model_serializers'
class UsersController < ApplicationController
def show
user = User.find(params[:id])
render json: user, serializer: UserSerializer
end
end
class UserSerializer < ActiveModel::Serializer
attributes :id, :name, :email
has_many :posts
has_one :profile
def posts
object.posts.limit(10)
end
end
ActiveModel::Serializer
の場合はシリアライザー
内にメソッドを定義できる為、容易にカスタマイズが可能です。
一方で、ビジネスロジックが肥大化してしまうと、モデルファイルとの区分けや見通しが悪くなる為、設計を考える必要があります。
json-api-serializer
gem 'jsonapi-serializer'
class UsersController < ApplicationController
def show
user = User.find(params[:id])
render json: UserSerializer.new(user).serializable_hash.to_json
end
end
class UserSerializer
include JSONAPI::Serializer
attributes :id, :name, :email
has_many :posts, serializer: PostSerializer
has_one :profile, serializer: ProfileSerializer
end
json-api-serializer
はNETFLIX
が開発したfast_jsonapi
を基に作られたGemです。
fast_jsonapi
はパフォーマンステストによると、Active Model Serializersと比較して最大40倍以上高速に動作したことが結果として得られたそうです。
一方でfast_jsonapi
のメンテナンスは止まっており、現状唯一シリアライザーとしてメンテナンスされているjson-api-serializer
を扱う事がスタンダードかもしれません。