※ 2020/03時点でforkされた下記プロジェクトで開発が進行しているようです.PRやissueはこちらにあげたほうが良いかもしれません.
https://github.com/fast-jsonapi/fast_jsonapi
※ 2019/12時点でかなり雲行きが怪しくなっているので別のシリアライザの導入の検討をおすすめします.
https://github.com/Netflix/fast_jsonapi/issues/433
はじめに
RailsAPIでjsonでレスポンス返す場合に候補となるライブラリはいくつかあるのですがjbuilderはいわずもがなAMS(ActiveModel::Serializer)でもレコード数が多かったりするとわりとjson作るのに時間がかかる場合があります。
他に候補ないかなと思ったところNetflixOSSのfast_jsonapiが速いとのこと、基本的にAMSの思想を踏襲しているようでAMSを使ったことがある人であればわりと感覚的に書けるのですが公開されてまだ間もないこともありドキュメントもあまり充実していなかったのでまとめたいと思います。
Tips
attributeをカスタマイズする
AMS的にいうとdef hoge
みたいにプロパティを作りたいケース。
公式にも書いてあるのであえて書くまでもないのですが一応。
下記name_with_year
というカスタムプロパティを作る場合です。
class MovieSerializer
include FastJsonapi::ObjectSerializer
attributes :name, :year
attribute :name_with_year do |object|
"#{object.name} (#{object.year})"
end
end
serializerにパラメーターを渡す
AMSでいうscope的な機能を使いたいケースです。
こちらまだmasterブランチには機能として存在しないようですが、下記PRでdevのほうにはマージされているので2018/05/10現在利用したい場合はdevブランチを利用することになります。
https://github.com/Netflix/fast_jsonapi/tree/dev
gem 'fast_jsonapi', git: 'https://github.com/Netflix/fast_jsonapi', branch: 'dev'
Serializerの第2引数がoptionsになるのでparamsというkeyに対してobjectをセットします。
MovieSerializer.new(@movies, {params: {user: current_user}})
attributeメソッドでブロックと引数としてobject+paramsが受け取れます。
class MovieSerializer
include FastJsonapi::ObjectSerializer
attribute :name_with_year do |object, params|
current_user = params[:user]
end
end
hashをcacheする
謎に韻を踏んでしまいました、とはいえもっと早くしたいのでcacheしたいパターンです。
class MovieSerializer
include FastJsonapi::ObjectSerializer
cache_options enabled: true, cache_length: 12.hours, race_condition_ttl: 10.seconds
end
cache_keyが設定できない?
cache_optionsとしてはenable
cache_length
race_condition_ttl
の3つが設定できますが、これだとuserに紐付いたデータはキャッシュできないように思えます。
ドキュメントをよく読むとしれっとRequires a cache_key method be defined on model
と書いてあるので例えば以下のようにモデルにcache_keyメソッドを定義することでカスタマイズ可能です。
class Movie < ApplicationRecord
def cache_key
"#{id}_#{user.id}
end
end
おわりに
以上PR・issueみたりコード読まないとわかりにくかったりしたところをあげてみました。リリース間もないライブラリということで今後の動向を注視しつつ何かあったら更新していきたいと思います。
ref
https://medium.com/netflix-techblog/fast-json-api-serialization-with-ruby-on-rails-7c06578ad17f
https://github.com/Netflix/fast_jsonapi/pull/49
https://github.com/Netflix/fast_jsonapi/pull/205