LoginSignup
23
13

More than 3 years have passed since last update.

Netflix製fast_jsonapiのTips

Last updated at Posted at 2018-05-16

※ 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を使ったことがある人であればわりと感覚的に書けるのですが公開されてまだ間もないこともありドキュメントもあまり充実していなかったのでまとめたいと思います。

fast_jsonapi

Tips

attributeをカスタマイズする

AMS的にいうとdef hoge みたいにプロパティを作りたいケース。
公式にも書いてあるのであえて書くまでもないのですが一応。
下記name_with_year というカスタムプロパティを作る場合です。

MovieSerializer.rb
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

Gemfile.
gem 'fast_jsonapi', git: 'https://github.com/Netflix/fast_jsonapi', branch: 'dev'

Serializerの第2引数がoptionsになるのでparamsというkeyに対してobjectをセットします。

MovieController.rb
MovieSerializer.new(@movies, {params: {user: current_user}})

attributeメソッドでブロックと引数としてobject+paramsが受け取れます。

MovieSerializer.rb
class MovieSerializer
  include FastJsonapi::ObjectSerializer

  attribute :name_with_year do |object, params|
    current_user = params[:user]
  end
end

hashをcacheする

謎に韻を踏んでしまいました、とはいえもっと早くしたいのでcacheしたいパターンです。

MovieSerializer.rb
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メソッドを定義することでカスタマイズ可能です。

Movie.rb
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

23
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
13