Rails のプロジェクト開始時の gem 選定

## Rails のプロジェクト開始時の gem 選定

議題としてはプロジェクトを立ち上げる際の gem についてです！

作成するプロジェクトは API モードを使用した人材サービスで 3 つのユーザータイプが存在して、将来的にユーザーごとに role を作っていく可能性がありました。 <br>

今回はユーザータイプを横断して使うことがないため求職者 & 求人者 & 管理者 の 3 つのユーザーテーブルを作ることにしました。

###### 目次

1.  Authentication(ログインとか認証周り)
2.  Authorization(権限周り)
3.  Serialization(Json とかのシリアライゼーション)
4.  Admin Page(管理画面)
5.  Pagination(ページネーション)
6.  How To Study

順を追ってなぜ選んでいったかを説明していきます。

#### 軽く自己紹介

Rails に全く触ったことがなかったが、プロジェクトで必要になり一人で奮闘中。。<br>
偶然であった **大倉さん** にメンタリングをお願いし、プロジェクトの遂行と自己の成長の両者を得ようとしているしがないエンジニアです。<br>
前回は React を全く触ったこともないくせに開発し、現在は SNS 開発のフロントエンドをしている。

### 1. Authentication

選定した gem : device <br > url: https://github.com/plataformatec/devise

##### 検討したリスト

- devise(☆19,101) https://github.com/plataformatec/devise

こちらを選択した理由は、僕が使っている学習方法や多くのサンプルがあるということでした。<br>
しかし、最近では多様なログイン方法や登録方法などがあってカスタマイズ性が必要になってくることが多くなり、devise を使ってしまうとカスタマイズするときに苦労をするため避けるような傾向にもあるようです。<br>
また、API モードにすると `devise` の良さでもあるページが同時に作成されるなどの機能を使うことがないのであまり利用価値が。。。とも思ったのですが、やはり私自身が**Rails 初心者**のため、認証周りをすべて実装するには骨が折れるため利用しました！

### 2. Authorization

選定した gem : pundit <br > 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

こちらを選択した理由は、メンターより海外では圧倒的に利用されているということで選定しました。<br>
認可周りで検索を行うと結構 `cancancan` などが多く出てくるのですが、結構古い記事などが多かったりなどもあるようでした。
他にも日本人が作った？ `banken` なども検討には入りましたが、やはりスター数や盛り上がりを考えて, 今後の認可周りの管理は `pundit` にすることにしました。

### 3. Serialization

選定した gem : active_mode_serializers <br > 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` を使っていたことが理由でした。<br>
しかし、しっかりとメンターから話しを聞いてみると、カスタマイズ性などが `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 <br > 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 <br > 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 の作者から以下のコメントがでるほどしっかりと説明をしてくれているようなので、もしよかったら見てみてください。<br>
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** で以前、海外コミュニティの勉強会でお会いしてメンタリングを行っているということだったのでお願いしました。

### 本当にありがとうございます！！

<br>
<br>
<br>最後に今後もこういった記事を上げていけるようにしていきます。