Rails のプロジェクト開始時の gem 選定
議題としてはプロジェクトを立ち上げる際の gem についてです!
作成するプロジェクトは API モードを使用した人材サービスで 3 つのユーザータイプが存在して、将来的にユーザーごとに role を作っていく可能性がありました。
今回はユーザータイプを横断して使うことがないため求職者 & 求人者 & 管理者 の 3 つのユーザーテーブルを作ることにしました。
目次
- Authentication(ログインとか認証周り)
- Authorization(権限周り)
- Serialization(Json とかのシリアライゼーション)
- Admin Page(管理画面)
- Pagination(ページネーション)
- How To Study
順を追ってなぜ選んでいったかを説明していきます。
軽く自己紹介
Rails に全く触ったことがなかったが、プロジェクトで必要になり一人で奮闘中。。
偶然であった 大倉さん にメンタリングをお願いし、プロジェクトの遂行と自己の成長の両者を得ようとしているしがないエンジニアです。
前回は React を全く触ったこともないくせに開発し、現在は SNS 開発のフロントエンドをしている。
1. Authentication
選定した gem : device
url: https://github.com/plataformatec/devise
検討したリスト
- devise(☆19,101) https://github.com/plataformatec/devise
こちらを選択した理由は、僕が使っている学習方法や多くのサンプルがあるということでした。
しかし、最近では多様なログイン方法や登録方法などがあってカスタマイズ性が必要になってくることが多くなり、devise を使ってしまうとカスタマイズするときに苦労をするため避けるような傾向にもあるようです。
また、API モードにすると devise
の良さでもあるページが同時に作成されるなどの機能を使うことがないのであまり利用価値が。。。とも思ったのですが、やはり私自身がRails 初心者のため、認証周りをすべて実装するには骨が折れるため利用しました!
2. Authorization
選定した gem : pundit
url: https://github.com/varvet/pundit
検討したリスト
- pundit(☆6,149) https://github.com/varvet/pundit
- banken(☆192) https://github.com/kyuden/banken
- cancancan(☆4,113) https://github.com/CanCanCommunity/cancancan
こちらを選択した理由は、メンターより海外では圧倒的に利用されているということで選定しました。
認可周りで検索を行うと結構 cancancan
などが多く出てくるのですが、結構古い記事などが多かったりなどもあるようでした。
他にも日本人が作った? banken
なども検討には入りましたが、やはりスター数や盛り上がりを考えて, 今後の認可周りの管理は pundit
にすることにしました。
3. Serialization
選定した gem : active_mode_serializers
url: https://github.com/rails-api/active_model_serializers
検討したリスト
- active_model_serializers(☆4,662) https://github.com/rails-api/active_model_serializers
- fast_jsonapi(3,340) https://github.com/Netflix/fast_jsonapi
選択理由は 1 つめと近いのですが学習サンプルが active_model_serializers
を使っていたことが理由でした。
しかし、しっかりとメンターから話しを聞いてみると、カスタマイズ性などが fast_jsonapi
よりも勝ると言うことが一番の選定理由でした。
ただ、 fast_jsonapi も負けておらず、処理速度の面では圧倒的にactive_model_serializers
を凌駕するようです。
$ rspec
Active Model Serializer serialized 250 records in 138.71 ms
Fast JSON API serialized 250 records in 3.01 ms
250 レコードの処理スピードでもこれだけ早いのですが、1000 レコードを処理するのにも最低でも 25 倍以上はactive_model_serializers
より早いようです。
もう少しなれたら移行してもいいかもしれない。。。
ちなみに JSON:API とは既に決まっている作りでこちらを参考にしてもらえれば! http://jsonapi.org/
なぜ serializer
を入れる必要があるのー?というと、参照データ?子モデルや孫モデルが合ったときにひも付きを簡単にしてくれて、しかも JSON フォーマットに合わせてくれるよーっていうような感じです!
詳細は Rails のすごい人とかに聞いてみてください(´∀ `)
4. Admin Page
選定した gem : administrate
url: https://github.com/thoughtbot/administrate
検討したリスト
- activeadmin(☆8,154) https://github.com/activeadmin/activeadmin
- rails_admin(☆6,889) https://github.com/sferik/rails_admin
- administrate(4,073) https://github.com/thoughtbot/administrate
こちらを選択した理由はカスタマイズ性に長けていて、一つ一つのコンポーネントが結構細かくなっているという理由からでした。
最初は多くのサンプルがあったり、自己学習で使っていた教材でも activeadmin
が使われていたため activeadmin
一本で行こうかと思ったら
結構多くの方がカスタマイズの部分で悩まれているようなことを聞いて、確認したら administrate
がいいよとメンターに言われたので選択しました。
5. Pagination
選定した gem : pagy
url: https://github.com/ddnexus/pagy
検討したリスト
- kaminari(☆7,222) https://github.com/kaminari/kaminari
- pagy(☆1,098) https://github.com/ddnexus/pagy
こちらを選択した理由は 従来多く使われてきた kaminari より 処理だけで 29 倍も早くなり他にもメモリー消費量が 18 分の 1 になるなどいい事ずくめのため、選定しました。
Go Rails でも評判で、この動画を作っている人は pagy の作者から以下のコメントがでるほどしっかりと説明をしてくれているようなので、もしよかったら見てみてください。
https://gorails.com/episodes/pagination-with-pagy-gem?autoplay=1
I couldn't have explained it better - even being the author of Pagy.
Thank you!
Pagyの作者の私でも、これほど上手に説明できないよ!
ありがとう!
by Domizio Demichelis
6. How To Study
学習リスト
- Rails 公式 https://guides.rubyonrails.org/
- Go Rails https://gorails.com/dashboard
- Drifting Ruby https://www.driftingruby.com/
これらを用意しておけば基本的には全てうまくいくだろう!
最後に
今回色々教えていただけたのは メンター 大倉さん https://twitter.com/okuramasafumi で以前、海外コミュニティの勉強会でお会いしてメンタリングを行っているということだったのでお願いしました。
本当にありがとうございます!!
最後に今後もこういった記事を上げていけるようにしていきます。