地方でリモートワーク in Iwate

東京の受託開発会社でリモートワークしてます。

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

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