Studyplus Engineering Blog

スタディプラスの開発者が発信するブログ

突撃!隣のRubyGems

こんにちは、スタディプラスの島田です。好きな漫画は「葬送のフリーレン」です。

はじめに

スタディプラスでは、Railsで開発しているプロダクトが2つあります。

それぞれのプロダクトはサービスの性質や歴史が異なり、別なチームが担当しているので同じRailsでも利用しているGemに特色があります。

Railsで開発していると、他のチームがどんなGemを利用して開発をしているのか気になることありませんか?

ということで、今回は、Studyplus for School(以下FS) で利用しているGemの紹介をします。

利用している全てのGemを紹介すると大変なので、紹介する内容については私の独断と偏見で、

  • FSチームの開発をなんとなく想像できる
  • FSの開発でよく利用している
  • あまり有名ではないかもしれないがとても便利

といった観点でピックアップしたGemをご紹介します。

Gemの紹介

activerecord-import

github.com

DBにデータをbulk insertしてくれるGemです。Rails6からinsert_allが利用できるようになりましたが、まだまだ機能的にはactiverecord-importの方が重宝しています。

after_commit_everywhere

github.com

トランザクションがコミットされた後に実行したい処理を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

github.com

画像のアップロードではcarrierwaveとcarrierwave-awsを利用しています。

committee

github.com

APIのスキーマ定義テストにはcommitteeを利用しています。 詳しい内容については以下の記事を参照してください。

tech.studyplus.co.jp

config

github.com

定数管理にはconfigを利用しています。定数を環境ごとで変更する場合に便利です。

hashid-rails

github.com

モデルのIDを外部へ公開したくない場合に、idをハッシュ化してくれるGemです。 データベースのIDはそのままで、ハッシュ値を利用してモデルから検索できます。

interactor

github.com

アプリケーションのビジネスロジックをカプセル化するためのGemです。 FSチームでは、ドメインによる振る舞いをモデル・コントローラから切り離すために利用しています。

例えば、コントローラ・モデルからユーザー登録後にメールを送信するといった振る舞いを切り出してモデル・コントローラの実装を薄くしています。

class RegisterUserInteractor
  include Interactor

  def call
    user = context.user

    if user.register
      RegisterUserMailer.deliver_now!
    else
      context.fail!
    end
  end
end

jinrai

github.com

弊社のエンジニアが公開したGemになります。カーソルベースのページネーションライブラリです。

詳しい内容については以下の記事を参照してください。

tech.studyplus.co.jp

retriable

github.com

ジョブや外部通信等でリトライ処理をする事が多いです。 このGemは、とても軽量ですが痒い所に手が届く感じです。リトライ処理を自分たちで実装して、車輪の再発明をするよりも効率が良いと感じています。

ridgepole

github.com

Railsのマイグレーション機能を利用せずに、DBのスキーマを管理するGemです。

テーブルが多くなってきたり、スキーマ変更をする際にマイグレーションファイルを扱うのにとても手間がかかりますが、このGemを利用するとそれらの煩雑な作業から解放されるのでとても助かっています。

sentry-ruby

github.com

エラー監視にはSentryを利用しています。

sidekiq

github.com

非同期処理にはSidekiqを利用しています。

最後に

以上、簡単ではありますが「Studyplus for School」で利用しているGemの紹介でした。 今後のRails開発の一助になればと考えています。 また、これによってFSチームの開発への興味を持っていただけると幸いです。