2016-02-22 2 views
2

Здесь у меня есть таблица Order и OrderReport. Я делаю присоединение к нему, извлекая некоторые данные из каждой из таблиц.Параметры диапазона дат к запросу SQL/ActiveRecord в Rails

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. Я знаю, что бы начать, делая это:

attr_reader :start_date, :end_date 

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

ответ

2

Вы можете просто достичь этого путем определения сферы, как это:

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.

Смежные вопросы