Ruby or Railsで期間内で一定間隔ごとの時間を作成する方法

f:id:ihatov08:20160927180515j:plain

from_delivery_timeとto_delivery_timeというtime型のカラムを持っています。
この時間内で、一定間隔ごと、例えば30分毎の時間の配列を作成します。

[4] pry(main)> ChefFood.first.from_delivery_time
ChefFood Load (2.0ms)  SELECT  `chef_foods`.* FROM `chef_foods` ORDER BY `chef_foods`.`id` ASC LIMIT 1
=> 2000-01-01 10:30:00 UTC
[5] pry(main)> ChefFood.first.to_delivery_time
ChefFood Load (0.8ms)  SELECT  `chef_foods`.* FROM `chef_foods` ORDER BY `chef_foods`.`id` ASC LIMIT 1
=> 2000-01-01 20:00:00 UTC

この場合、10:30から20:00まで30分間隔ごとの配列です。

期待する出力

["10:30",
"11:00",
"11:30",
"12:00",
"12:30",
"13:00",
"13:30",
"14:00",
"14:30",
"15:00",
"15:30",
"16:00",
"16:30",
"17:00",
"17:30",
"18:00",
"18:30",
"19:00",
"19:30",
"20:00"]
  • 色々試した結果、Timeクラスのオブジェクトはイテレータ系のメソッド(each, step)は使えませんでした。
  • なので、いったんintegerに変換してから、イテレータ系メソッド、今回はstepを用いてみました。
  • mapを使って配列を生成しています。
  • Time.at(57230532)で整数からTimeオブジェクトに変換してくれます。
  • strftimeで出力を整形して完成です。
  def create_delivery_times_every(time)
increment = time.to_i
from_time = from_delivery_time.to_i
to_time   = to_delivery_time.to_i
from_time.step(to_time, increment).map { |m| Time.at(m).strftime('%H:%M') }
end

けっこう見やすく書けたと思う。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です