happybirthday | RubyGems.org | your community gem host
使い方は以下の通り
require 'happybirthday' birthday = Happybirthday.born_on('2000-01-01') birthday.age.years_old # => 18
「x年後は何歳か」「◯年△月□日の時点では何歳か」みたいなのも簡単に求められます。
birthday = Happybirthday.born_on('2000-01-01') # 10年後は何歳か birthday.age.years_after(10).years_old # => 28 # 2020-01-01の時点では何歳か birthday.age.at('2020-01-01').years_old # => 20
詳細はドキュメントを参照してください。
きっかけ
あるプロジェクトでQiitaの記事のコードをコピペしてユーザーの生年月日から年齢を計算している処理を見かけて
「いやこれくらいgemあるやろ」と思って調べ始めたものの、いい感じのgemがなさそうだったことをきっかけに作り始めました。
「rails 年齢」でググると僕の環境では検索結果の1位に表示される記事なので、けっこういろんなプロジェクトに埋まっていそう。
実装上のポイント
今回少し悩んだのがクラス分割の設計
ソースコードを見てもらうと分かる通り Birthday
, Age
という2種類のクラスに大半の実装がされています。
初期段階では Birthday
クラスしか存在しなかったのですが、年齢を計算する場合に「誕生日」と「年齢を計算する起点となる日付」の2つの値を必ず利用する必要があり
「誕生日」という不変なものを表すクラスに、計算のためだけに必要な日付を持たせるのはおかしいという意見をもらい Age
クラスを作って分離することにしました。
このあたりの設計については同僚である id:hiragram や @rllllho、塩崎さん に随分相談にのってもらったので感謝 🙏
さいごに
v1.0.0をリリースしたばかりなので、これからいくつか機能を足す予定です。
いろんなwebアプリでのユースケースを想像すると「成人しているか」を返すメソッドがあると喜ばれそうだなとか考えてるんですが、欲しい機能などあればissueで意見もらえると幸いです。