在Rails中将日期范围参数传递给SQL/ActiveRecord查询
这里我有一个订单和一个OrderReport表。我正在对它进行连接,从每个表中提取一些数据在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.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适配器的兼容性