【问题标题】:Rails 3: Validating Model uniqueness of Time within a Time RangeRails 3:验证时间范围内时间的模型唯一性
【发布时间】:2011-08-16 17:43:15
【问题描述】:

我的模型有 start_time:time 和 end_time:time 字段。我想要做的是检查我的特定预订模型的 start_time 到 end_time 范围是否与任何其他预订重叠。

因此,如果在 2 日星期三下午 4 点到 6 点有预订,那么在下午 4 点到 6 点的任何时候都不能再进行预订。我该怎么做呢?我不太确定如何根据其他预订条目中的其他 start_time、end_time 元组验证时间范围。

【问题讨论】:

    标签: ruby-on-rails validation time model


    【解决方案1】:

    我会避免使用validates 来满足这个特定的需求,而只是做一些更像

    before_save :time_check
    
    def time_check
       if #time in range
          #reject
       else
          #accept!
    end
    

    或类似的东西,您需要帮助检查实际时间吗? 请记住,您可以将秒数添加到时间对象 Time.now + (60*60)*hours 以获取 < and > tests 的范围

    【讨论】:

    • 我只是不确定如何对照其他条目中的时间检查我的时间。我的意思是,如果我有一个以 x 开头和 y 结尾的条目,我怎么知道 x 和 y 是什么?基本上,我如何编写方法来检查我的 Reservation 表中的所有条目?
    【解决方案2】:

    可能是这样的:

    def intersects?(reservation)
      to = reservation.end_time
      from = reservation.start_time
      Reservation.where('start_time > ? OR end_time < ?', to, from).count > 0
    end
    

    【讨论】:

    • 这不适用于过去和未来日期之间的预订。
    • 我认为确实如此。你能举个例子吗?
    • 如果您有一个 12:00 - 13:00 的预订和一个 15:00 - 16:00 的预订并且想要预订 14:00 - 15:00 Reservation.where('start_time > 14 :00 OR end_time
    • 如果我理解正确,您想返回所有与给定预订相交的预订吗?因为在您提供的方案中,我的解决方案不会返回任何结果(count == 0,所以相交?会返回 false),这应该是正确的吗?
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    相关资源
    最近更新 更多