こんにちは、スタディプラスの島田です。好きな漫画は「葬送のフリーレン」です。
はじめに
スタディプラスでは、Railsで開発しているプロダクトが2つあります。
それぞれのプロダクトはサービスの性質や歴史が異なり、別なチームが担当しているので同じRailsでも利用しているGemに特色があります。
Railsで開発していると、他のチームがどんなGemを利用して開発をしているのか気になることありませんか?
ということで、今回は、Studyplus for School(以下FS) で利用しているGemの紹介をします。
利用している全てのGemを紹介すると大変なので、紹介する内容については私の独断と偏見で、
- FSチームの開発をなんとなく想像できる
- FSの開発でよく利用している
- あまり有名ではないかもしれないがとても便利
といった観点でピックアップしたGemをご紹介します。
Gemの紹介
activerecord-import
DBにデータをbulk insertしてくれるGemです。Rails6からinsert_allが利用できるようになりましたが、まだまだ機能的にはactiverecord-importの方が重宝しています。
after_commit_everywhere
トランザクションがコミットされた後に実行したい処理をafter_commit
ブロックで実装することによって、外側のブロックでトランザクションが開始されても正常に処理ができるGemです。
以下の例のように、Bar.transaction
がコミットされた後に after_commit
が実行されるので、外側のトランザクションがコミットする前にJobが実行されてしまうなどのバグを防ぐ事ができます。
例)
def something Foo.transaction do foo.save after_commit do SampleJob.perform_later end end end def something2 Bar.transaction do something end end
carrierwave
画像のアップロードではcarrierwaveとcarrierwave-awsを利用しています。
committee
APIのスキーマ定義テストにはcommitteeを利用しています。 詳しい内容については以下の記事を参照してください。
config
定数管理にはconfigを利用しています。定数を環境ごとで変更する場合に便利です。
hashid-rails
モデルのIDを外部へ公開したくない場合に、idをハッシュ化してくれるGemです。 データベースのIDはそのままで、ハッシュ値を利用してモデルから検索できます。
interactor
アプリケーションのビジネスロジックをカプセル化するためのGemです。 FSチームでは、ドメインによる振る舞いをモデル・コントローラから切り離すために利用しています。
例えば、コントローラ・モデルからユーザー登録後にメールを送信するといった振る舞いを切り出してモデル・コントローラの実装を薄くしています。
class RegisterUserInteractor include Interactor def call user = context.user if user.register RegisterUserMailer.deliver_now! else context.fail! end end end
jinrai
弊社のエンジニアが公開したGemになります。カーソルベースのページネーションライブラリです。
詳しい内容については以下の記事を参照してください。
retriable
ジョブや外部通信等でリトライ処理をする事が多いです。 このGemは、とても軽量ですが痒い所に手が届く感じです。リトライ処理を自分たちで実装して、車輪の再発明をするよりも効率が良いと感じています。
ridgepole
Railsのマイグレーション機能を利用せずに、DBのスキーマを管理するGemです。
テーブルが多くなってきたり、スキーマ変更をする際にマイグレーションファイルを扱うのにとても手間がかかりますが、このGemを利用するとそれらの煩雑な作業から解放されるのでとても助かっています。
sentry-ruby
エラー監視にはSentryを利用しています。
sidekiq
非同期処理にはSidekiqを利用しています。
最後に
以上、簡単ではありますが「Studyplus for School」で利用しているGemの紹介でした。 今後のRails開発の一助になればと考えています。 また、これによってFSチームの開発への興味を持っていただけると幸いです。