所以说我有一个TimeSlot
对象,(它应该代表一个访谈时间段),我有一段时间我希望时间段填满。假设我想在明天上午10点到下午5点以30分钟的增量(即14个总时段)填写时隙。
TimeSlot对象有两个datetime
属性,一个表示开始时间,另一个表示结束时间。
我希望我的应用管理员能够输入两个datetime
和一个incrementlength
(即30分钟),我希望动态生成TimeSlot
的集合数据库中表示指定时间范围的对象,切换为incrementlength
分钟的增量。例如,上面示例生成的TimeSlots将是:
上午10点 - 上午10点30分 - 上午10点30分 - 上午11点/等。
我在哪里定义这样的方法,我究竟如何在方法中创建TimeSlot
个对象,以及如何让管理员调用这样的方法?对不起,我真的不知道从哪里开始。感谢。
答案 0 :(得分:1)
你可以在模型中定义它,它将是一个类方法,因为它没有分配给类的一个对象,而是分配给类本身。我会像这样解决它
def self.create_by_interval(start_time, end_time, intervall)
((end_time.to_i-start_time.to_i)/(intervall*60)).floor.times do |factor|
TimeSlot.create(:start => start_time+(factor*intervall).minutes, :end_time => start_time+((factor+1)*intervall).minutes)
end
end
当您在日期上调用to_i
时,会将其转换为unix时间戳,以便end_time.to_i-start_time.to_i
计算开始日期和结束日期之间的分区。这些秒由间隔决定,以确定需要多少个对象。 floor
方法向下舍入Float
,因为您无法创建1.99个日历对象;)
我从头脑中写下这可能并不完美,但应该说清楚它是如何完成的。
//您需要创建一个提交所需数据的表单。然后,您可以处理在params?
哈希中接收输入数据的操作中的数据。您的表单可能如下所示:
<%= form_for :date_range, :url => working_path_helper do |f| %>
<%= f-label :start_time %><br />
<%= f.text_field :start_time %><br />
<%= f-label :end_time %><br />
<%= f.text_field :end_time %><br />
<%= f-label :intervall %><br />
<%= f.text_field :intervall %><br />
<%= f.submit %>
<% end %>
然后在控制器中你需要调用类方法,如:
TimeSlot.create_by_interval(Time.parse(params[:date_range][:start_time]), Time.parse(params[:date_range][:end_time]), params[:date_range][:intervall])
Time.parse
方法返回一个基于字符串的时间对象,因为你不能通过http传输任何其他字符串。