【问题标题】:Rails Overalps DateTimeRails Overalps 日期时间
【发布时间】:2023-03-17 11:00:01
【问题描述】:

我目前正在尝试检查两个日期时间范围是否重叠。我有两个问题

首先,重叠总是返回 false,即使我一遍又一遍地提交相同的开始时间,持续时间为 1 小时(即开始时间是下午 3 点,结束时间是下午 4 点,重复提交总是会创建一个没有通过重叠返回真实声明并返回一个 JSON 说明培训师已被预订)。所以 if 语句永远不会被命中。 秒,Rails 中的 Overlaps 在其方法中使用 >=,我无法将其覆盖以包含 >(端点不返回 true,即 3-4PM 和 4-5PM 不应重叠)。

如何在不包括端点的情况下检查两个日期时间并返回 true?我是否从 JSON 格式错误的日期?我的if语句错了吗?它们作为带有时区(timestampz)的日期时间存储在 postgresql 中。

def create_request_iphone

  @start_time = DateTime.parse(params[:start_time])
  @end_time = @start_time + params[:duration].to_f.hour

  #logic to check if trainer is booked at that time
  @trainer = Trainer.where(id: params[:trainers_id]).first
  @booked_session = @trainer.session_details

  //logic to check if trainer has booked sessions that overlap

  @booked_session = @trainer.session_details

  @booked_session.each do |aSession|
    if (aSession.start_time..aSession.end_time).overlaps?(@start_time..@end_time)
        respond_to do |format|
          msg = {:status => "FAILURE", :message => "TRAINER ALREADY BOOKED"}
          format.json  { render :json => msg }
        end
        return
    end
  end

  @session_detail = SessionDetail.new(trainers_id: @trainer.id)

   unless(!@session_detail.save)
      respond_to do |format|
        msg = {:status => "SUCCESS", :message => @session_detail.as_json)
        format.json  { render :json => msg } # don't do msg.to_json
      end
     end
   end

【问题讨论】:

  • 最终使用了以下'def重叠?(x,y) (x.first - y.end) * (y.first - x.end) > 0 end'

标签: ruby-on-rails ruby json postgresql datetime


【解决方案1】:

使用Range 的三点... 版本,不包括右端点。

例如:

(1..4).overlaps? (4..8)
# => true

(1...4).overlaps? (4..8)
# => false

【讨论】:

  • 怎么样:(4...8).overlaps?(1..4) ?那不行吗? Colud (4...8).overlaps?(1...4) 工作,即两个上的三个点?
  • 而且它仍然总是返回 true,所以这不起作用。 IT 应该返回 false
  • 对不起,这意味着它总是返回 false。可能是格式问题
  • 这仅排除其中一个边界。 OP 希望排除两个范围内的两个边界。看看我的回答。
  • @Humza 没有必要排除两个端点。对于 OP 想要的应用程序,使用带有三个点 ... 的 Range 就足够了。
【解决方案2】:

除了 @matt 的三重 ... 建议之外,我发现以下内容也有效

def overlap?(x,y)
 (x.first - y.end) * (y.first - x.end) > 0
end

关键是删除包含在活动记录中的 >=。

http://makandracards.com/makandra/984-test-if-two-date-ranges-overlap-in-ruby-or-rails

【讨论】:

    猜你喜欢
    • 2018-05-29
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多