【问题标题】:How to create scope or function to select records in specific hours in specific day?如何创建范围或功能以选择特定日期特定时间的记录?
【发布时间】:2016-10-20 03:56:49
【问题描述】:

我有一个模型 Order.rb。我想在特定日期选择特定时间范围内的所有订单。例如:选择昨天 0-6 小时内创建的所有订单。或选择前天 0-12 小时内创建的所有订单。

目前,我可以创建范围以选择特定日期的订单。这里是:

scope :in_day, -> (day) { where("orders.created_at >= ?", (-1 * day).days.ago.beginning_of_day)\
      .where("orders.created_at < ?", (-1 * (day + 1)).days.ago.beginning_of_day) }

所以我可以在 2 天前收到所有订单:

Order.in_day(-2)

但是我不知道如何创建像in_hour这样的范围,所以当我需要从2天的0-6小时获得所有订单时,我只需要:

Order.in_hour(-2, 6)

或者类似的东西。

此外,我想在特定日期的特定时间范围内选择回复的订单。得到回复订单的代码如下:

Order.joins( "LEFT JOIN messages ON orders.id = messages.order_id").uniq.where( "messages.user_id = orders.receive_user_id")

我可以选择前1天0-12小时内所有回复的订单:

Order.where(created_at: (1.days.ago.beginning_of_day.to_time..(1.days.ago.beginning_of_day.to_time + 12.hours))).joins( "LEFT JOIN messages ON orders.id = messages.order_id").uniq.where( "messages.user_id = orders.receive_user_id").count

但是,我仍然不知道如何为其创建范围。有人可以帮忙吗?

【问题讨论】:

    标签: sql ruby ruby-on-rails-4 activerecord


    【解决方案1】:

    经过数小时的尝试和错误,我在特定日期的几个小时内收到了回复订单:

    scope :replied_in_hour, -> (day, hour) { where("orders.created_at >= ?", (-1*day).days.ago.beginning_of_day.to_time)\
          .where("orders.created_at < ?", (-1*day).days.ago.beginning_of_day.to_time + hour.hours)\
          .joins( "LEFT JOIN messages ON orders.id = messages.order_id").uniq.where( "messages.user_id = orders.receive_user_id") }
    

    它似乎像我想要的那样工作!我在这里回答任何和我有同样问题的人。希望它会有所帮助! :)

    【讨论】:

      猜你喜欢
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多