ice_cubeでスケジュールの計算

記事タイトルとURLをコピーする

プログラマのおぐらです。

このところとんでもなく暑い日ばかりですが、みなさんいかがお過ごしでしょうか。こう暑い日が続くと、プログラミングしている間だけでも涼しさを感じられるような工夫が欲しいですね。

というわけで、今回はice_cubeという涼しげな名前のRuby用ライブラリのご紹介です。

ice_cubeは、

  • 毎日
  • 隔週の月曜日と火曜日
  • 毎月1日と最終日
  • 毎月第1と最終の火曜日
  • 2時間おき

といった、「一定のルールに基づいて繰り返し処理を行う」ときにネックとなる日時の計算を一手に引き受けてくれるライブラリです。予定の管理やメールの配信といったスケジューリングの必要な機能を実装する際に利用することで、複雑なルールも容易に扱うことができるようになります。

インストール

ice_cubeはgemパッケージとして公開されていますので、インストールは以下のようにgemコマンドで行います。

$ gem install ice_cube

ice_cubeの内部ではActiveSupportが既存クラスに対して追加するメソッドを呼び出す箇所があるのでactive_supportもインストールしておきましょう(Railsをお使いであれば既にインストールされているはずです)。

$ gem install activesupport

基本的な使い方

ice_cubeの中心となるのはIceCube::Scheduleクラスです。インスタンスを生成する際は、開始日をコンストラクタに渡します。

schedule = IceCube::Schedule.new(Time.local(2010, 7, 1))

スケジュールに特定の日付を指定して使う場合は、以下のようになります。

View on gist.github.com

上記のように特定の日時を指定することもできますし、一定の条件で何度も繰り返すスケジュールを定義することもできます。

View on gist.github.com

ただし、複雑なルールを定義した場合の挙動には若干バギーな部分もありますので、実際に使う前には想定した結果が返ってくることを確認しておいたほうがよさそうです。

Railsで使う

IceCube::Scheduleクラスには、スケジュールを永続化するためにYAMLやHashに変換するメソッドも定義されています。

View on gist.github.com

これらのメソッドをうまく利用することで、ActiveRecordなどのモデルにスケジュールを保持させることができます。

参考資料

ice_cubeの作者であるJohn Crepezziさんのプレゼン資料も公開されていますので、興味のある方はこちらもご覧ください。