这两个Ruby on Rails逻辑句子有什么区别?

时间:2017-09-18 04:00:31

标签: ruby-on-rails

我有一个rails应用程序,并且有一个过滤功能。其中一个过滤标准是时间值,当我尝试按时间标准过滤时,它会一直显示错误的结果。

**变量名称出错,所以我编辑了

start_time = DateTime.new(2000, 1, 1, 6, 0, 0)
end_time = DateTime.new(2000, 1, 1, 9, 0, 0)

当我执行过滤功能时,结果是:

Item.where("(start_at >= ? AND start_at < ?) OR (end_at > ? AND end_at <= ?) OR (start_at < ? AND end_at > ?)", start_time, end_time, start_time, end_time, start_time, end_time)
=> Item id: 5931

但是这个结果我执行相同的句子结果是:

(Item.find(5931).start_at >= start_time AND Item.find(5931).start_at < end_time)
=> false
(Item.find(5931).end_at > start_time AND Item.find(5931).end_at <= end_time)
=> false
(Item.find(5931).start_at < start_time AND Item.find(5931).end_at > end_time)
=> false
(Item.find(5931).start_at >= start_time AND Item.find(5931).start_at < end_time) or (Item.find(5931).end_at > start_time AND Item.find(5931).end_at <= end_time) or (Item.find(5931).start_at < start_time AND Item.find(5931).end_at > end_time)
=> false

有没有人能找到这一点? 如果我错过了所需的任何信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

要在两次之间查询数据,请使用SQL BETWEEN关键字:

Item.where(start_at: start_time..end_time)
# =>  SELECT "items".* FROM "items" WHERE ("items"."start_at" BETWEEN $1 AND $2)  [["start_at", 2000-01-01 06:00:00 UTC], ["start_at", 2000-01-01 09:00:00 UTC]]
..中的

start_time..end_time是一种特殊语法,可创建Range object

要添加OR子句,您可以使用Rails 5中的.or方法:

Item.where(start_at: start_time..end_time)
    .or(Item.where(end_at: start_time..end_time))

在Rails 4中,您需要编写SQL字符串:

Item.where(
  '(items.start_at BETWEEN :s AND :e) OR (items.end_at BETWEEN :s AND :e)', 
  s: start_time, e: end_time
)