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
けっこう見やすく書けたと思う。
コメントを残す