我有一个应用程序,用户将从可用日期和时间列表中选择订单的交货日期。我每天有两个插槽(中午12:00和下午18:00),我希望选择日期时间字段中显示的日期始终比当前日期时间早24小时,并显示接下来3天的壁橱日期和时间。
即如果下单前的时间是下午17:00,则下一个可用时间应该是第二天下午18:00。
目前我有一个datetime类型的delivery_times列,在视图表单中有以下选项
<%= f.datetime_select :delivery_time,
:default => 24.hours.from_now,
:minute_step => 30,
:discard_year => true%>
是否可以添加开始时间,结束时间和使用除默认值以外的小时步骤?
由于
答案 0 :(得分:1)
我认为这应该可以创建一个包含可用交付时间的列表:
# Determine the next available delivery time, 12:00 or 18:00
now = DateTime.now
next_hours = [12] * 12 + [18] * 6 + [12] * 6
next_start_hour = next_hours[now.hour]
# The offset in hours for each next entry in the list
offset_hours = if next_start_hour == 12
[6, 24, 30, 48]
else
[18, 24, 42, 48]
end
# Create an array of DateTime elements
first_option = now.change(hour: next_start_hour)
delivery_times = [first_option]
offset_hours.each do |offset|
delivery_times << first_option + offset.hours
end
p delivery_times
未针对所有开始时间和时区/夏令时问题进行测试,可能会出现一些边缘情况......
您可以使用delivery_times
数组为select
或其堂兄options_for_select
创建choices
参数。
<%= f.select :delivery_time, delivery_times.collect {|dt| [ dt.to_s(:long), dt.to_s(:db) ] } %>
这应该使用可用的交货日期呈现选择。 select的to_s(:db)
部分的id
格式应该可以轻松地将它保存到数据库中(是吗?)。显示的值可以随意调整。
创建delivery_times
数组的代码可以放在:
Order
模型中返回可用交付时间数组的方法。app
目录中存储业务逻辑的其他位置。