【问题标题】:Passing date range parameters to SQL/ActiveRecord query in Rails将日期范围参数传递给 Rails 中的 SQL/ActiveRecord 查询
【发布时间】:2016-02-22 12:35:45
【问题描述】:

这里有一个 Order 和一个 OrderReport 表。我正在对它进行连接,从每个表中提取一些数据。

 OrderReport.joins("INNER JOIN orders on orders.id = order_reports.for_object_id and order_reports.for_object_type = 'Order'").

group("order_reports.sales_user_id, EXTRACT(MONTH from event_at), orders.user_id,event_at").

pluck("order_reports.sales_user_id, EXTRACT(MONTH from event_at), orders.user_id,sum((cached_user_total_due - cached_sales_tax) * split_percentage), min(event_at)")

我有这个很长的 sql + ActiveRecord 查询。我想添加一个初始化程序,并让它接受日期开始和日期结束,使其更加灵活,以便能够从前一年提取报告。

开始和结束日期将来自具有 event_at 列的 Order 表。我知道我会从这样做开始:

  attr_reader :start_date, :end_date

  def initialize(start_date:, end_date:)
    @start_date = start_date
    @end_date = end_date 
  end

【问题讨论】:

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


    【解决方案1】:

    您可以通过定义这样的范围来简单地实现这一点:

    class OrderReport < ActiveRecord::Base
      scope :during, -> (start, end) {
        where('event_at >= ? AND event_at <=?', start, end)
      }
    end
    

    然后您就可以非常轻松地进行查询了:

    OrderReport.during(start_date, end_date).joins(pla pla pla)
    

    【讨论】:

      【解决方案2】:

      您可以通过以下方式使用范围对象来利用ActiveRecord 接口:

      class OrderReport
        scope :for, -> (begins, ends) { where(event_at: begins..ends) }
      end
      

      您可以使用 Date 对象或字符串参数传递给它,例如:

      # with strings
      OrderReport.for("2015-12-12", "2015-12-30")
      
      # with date objects
      begins = Date.new(2015, 12, 12)
      ends   = Date.new(2015, 12, 30)
      OrderReport.for(begins, ends)
      

      这将产生一个如下所示的 SQL 查询:

      SELECT * FROM 
        order_reports
      WHERE
        order_reports.event_at BETWEEN '2015-12-12' AND '2015-12-30'
      

      这样您就可以离开 Arel 来处理查询构建,您不必担心 SQL 适配器的可战斗性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-28
        • 2021-03-21
        • 1970-01-01
        • 2017-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多