Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Rails中将日期范围参数传递给SQL/ActiveRecord查询_Sql_Ruby On Rails_Ruby_Ruby On Rails 4_Activerecord - Fatal编程技术网

在Rails中将日期范围参数传递给SQL/ActiveRecord查询

在Rails中将日期范围参数传递给SQL/ActiveRecord查询,sql,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,Sql,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,这里我有一个订单和一个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.us

这里我有一个订单和一个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查询。我想添加一个初始值设定项,并让它包含一个日期开始和日期结束,以使它能够更灵活地从上一年的报告中提取数据

开始和结束日期将来自Order表,该表在列处有一个事件_。我知道我会从这样开始:

  attr_reader :start_date, :end_date

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

您只需定义如下范围即可实现这一点:

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

您可以通过以下方式使用范围对象来使用活动记录接口的作用域:

类订单报告 作用域:for,->begins,ends{whereevent_at:begins..ends} 终止 您可以使用如下方式向其传递日期对象或字符串参数:

用绳子 2015年12月12日、2015年12月30日的订单报告 使用日期对象 开始=日期。新2015年12月12日 结束日期=2015年12月30日 OrderReport.forbegins,结束 这将生成如下所示的SQL查询:

class OrderReport < ActiveRecord::Base
  scope :during, -> (start, end) {
    where('event_at >= ? AND event_at <=?', start, end)
  }
end
从中选择* 订单报告 哪里 在“2015-12-12”和“2015-12-30”之间订购报告。事件 通过这种方式,您可以让Arel处理查询构建,而不必担心SQL适配器的兼容性