Mongoid 检查文档更新的相交时间范围

Mongoid check intersecting time frames on document update

我想检查文档更新的时间范围是否与另一个时间范围相交。它适用于创建,但我无法更改任何内容。

这是我目前拥有的:

if Timetracking.where(:begin.lt => params[:timetracking][:end], :end.gt => params[:timetracking][:begin]) && Timetracking.find(params[:id]) != params[:id]
    @error = 'Time overlapping with another entry'
    render 'timetracking/edit'
else
    do update stuff
end

我的基本想法是检查时间是否重叠以及 id 是否与我正在更新的 id 不同。我也尝试了另一个查询但没有成功:

if Timetracking.where(:begin.lt => params[:timetracking][:end], :end.gt => params[:timetracking][:begin], :id.ne => params[:id])
    @error = 'Time overlapping with another entry'
    render 'timetracking/edit'
else
    do stuff
end

现在我有点卡住了。也许有人可以把我推向正确的方向,拜托。 :) 哦,我正在使用 Padrino。

谢谢。

我觉得你的逻辑可能有问题。您的代码测试新的时间跟踪 是否在 现有时间跟踪内,而不是它是否重叠。

那么,你有两种可能。我想你需要一个 or 语句:

  1. 它在另一个 Timetracking 的 beginend or
  2. 之间开始
  3. 它在另一个 Timetracking beginend
  4. 之间结束

另外,我建议你写一些规范。这将使查看正在发生的事情变得容易得多。

以下说法不正确。它永远是错误的:

Timetracking.find(params[:id]) != params[:id]

你想要这样的东西:

Timetracking.where(:begin.lt ..., :id.ne => params[:id])