Вы можете использовать следующие области действия модели -
class Ticket < ApplicationRecord
scope :daily_total_price, ->(date_time = Time.now) { where('created_at BETWEEN ? AND ?',date_time.beginning_of_day, date_time.end_of_day).sum(:subtotal) }
scope :weekly_total_price, ->(date_time = Time.now) { where('created_at BETWEEN ? AND ?',date_time.beginning_of_week, date_time.end_of_week).sum(:subtotal) }
scope :monthly_total_price, ->(date_time = Time.now) { where('created_at BETWEEN ? AND ?',date_time.at_beginning_of_month, date_time.end_of_month).sum(:subtotal) }
scope :last_7d_total_price, ->(date_time = Time.now) { where('created_at >= ?', (date_time - 7.days).beginning_of_day).sum(:subtotal) }
scope :last_30d_total_price, ->(date_time = Time.now) { where('created_at >= ?', (date_time - 30.days).beginning_of_day).sum(:subtotal) }
end
Использование областей действия
Ticket.daily_total_price # For daily scope
Ticket.weekly_total_price # For Weekly scope
Ticket.monthly_total_price # For monthly scope
Ticket.last_7d_total_price # For last 7 days scope
Ticket.last_30d_total_price # For 30 days scope
Также вы можете передать определенную дату в качестве аргумента
# With time zone
date_time_with_zone = Time.zone.parse("2018-09-30")
Ticket.daily_total_price(date_time_with_zone)
# Without time zone
date_time = Time.parse("2018-09-30")
Ticket.daily_total_price(date_time)
Я надеюсь, что это должно работать для вашего требования.