Range on Rails ― 「多重範囲型」という新たな選択肢が、複雑ロジックを劇的にシンプルにしたワケ

多重範囲型(multirange)を活用し、「複雑なロジックをシンプルにする方法」を紹介します。
さらに、ActiveRecordで多重範囲型を扱うためのノウハウを余すことなくお伝えします。

今年、自社で予約システムをゼロから開発し、どの時間帯でも柔軟に予約ができる、自由度の高い設計を実現しました。
予約が可能かどうかを判定するには、「すでに予約が入っている」「店舗が休業中」「マシンがメンテナンス中」「枠自体は空いていても、前後に余白がなく予約できない」など、さまざまな条件を考慮する必要があり、開発当初はコードも複雑でパフォーマンスも悪かったです。

そこで採用したのが、PostgreSQLの多重範囲型(multirange)です。
予約ができない様々な期間を「範囲の集合」であると捉え、予約を確認したい対象範囲との"差集合"を求めることで、コードは劇的にシンプルになり、パフォーマンスも飛躍的に改善しました。

多重範囲型が威力を発揮するケースは、予約システムに限りません。
「連続した値の集まり」を扱う処理全般において、「範囲」という数理的な発想をコードに持ち込むことで、複雑になりがちなロジックを驚くほどシンプルに表現できます。

Speaker

梅田智大

梅田智大

RIZAPテクノロジーズ株式会社にて、初心者向けコンビニジム「chocoZAP」のシステム開発・運用を担当しています。

弊社では、予約システムやスマートフォンアプリのバックエンドAPIをはじめ、会員登録、マイページ、認証認可基盤、顧客基盤、IoT連携やBigQueryとのデータ連携、社内向けの生成AI基盤に至るまで、幅広い領域でRubyおよびRuby on Railsを全面的に採用しています。