如何比较红宝石的日期?

时间:2016-01-28 19:39:43

标签: ruby ruby-on-rails-3

我正在运行一个SQL查询,它返回一些订单,每个订单都有一个日期。我想查看当前日期的订单是什么?

我可以通过以下方式完成:

orders = Order.find_by_sql(query).reject {|o|
  today = Time.now
  end_of_today = Time.local(today.year, today.month, today.day, 23, 59, 59)
  start_of_today = Time.local(today.year, today.month, today.day, 00,00,00 )
  o.date > end_of_today
  o.date < start_of_today
}.sort_by {|o|
  o.delivery_date
}

'orders'包含今天任何时候发出的所有订单。

在ruby中有更简单的方法吗?

4 个答案:

答案 0 :(得分:1)

要获取当前日期的订单,您可以执行以下操作:

orders = Order.where("date >= ?", Time.zone.now.beginning_of_day).order(:delivery_date)

希望这有帮助!

答案 1 :(得分:0)

使用DateTime.now.beginning_of_day

Order.where('date >= ?', DateTime.now.beginning_of_day).order(:delivery_date)

答案 2 :(得分:0)

现在您从数据库获取所有订单(取决于query中的字符串),然后过滤数组,如果您拥有大型数据库,这不是最有效的方式。更好的方法是在SQL端执行此操作。

只需使用纯字符串条件:

# Or set it to any other date in the past
target_date = Time.zone.now 

orders = Order.find_by_sql(query)
.where("date >= ?", target_date.beginning_of_day)
.where("date <= ?", target_date.end_of_day)
.order(:delivery_date)

此处有更多详情:http://guides.rubyonrails.org/active_record_querying.html#pure-string-conditions

有关Active Support DateTime方法的更多信息:http://api.rubyonrails.org/classes/DateTime.html#method-i-beginning_of_day

答案 3 :(得分:0)

我认为你正在寻找这个,它将涵盖今天的所有订单

orders = Order.where("created_at <= ? AND created_at >= ?", Time.zone.now.end_of_day, Time.zone.now.beginning_of_day).order(:delivery_date)