namespace :punching_bag do desc 'Combine old hit records together to improve performance' task( :combine, %i[by_hour_after by_day_after by_month_after by_year_after] => [:environment] ) do |_t, args| args.with_defaults( by_hour_after: 24, by_day_after: 7, by_month_after: 1, by_year_after: 1 ) distinct_method = Rails.version >= '5.0' ? :distinct : :uniq punchable_types = Punch.unscope(:order).public_send( distinct_method ).pluck(:punchable_type) punchable_types.each do |punchable_type| punchables = punchable_type.constantize.unscoped.find( Punch.unscope(:order).public_send(distinct_method).where( punchable_type: punchable_type ).pluck(:punchable_id) ) punchables.each do |punchable| # by_year punchable.punches.before( args[:by_year_after].to_i.years.ago ).each do |punch| # Dont use the cached version. # We might have changed if we were the combo punch.reload punch.combine_by_year end # by_month punchable.punches.before( args[:by_month_after].to_i.months.ago ).each do |punch| # Dont use the cached version. # We might have changed if we were the combo punch.reload punch.combine_by_month end # by_day punchable.punches.before( args[:by_day_after].to_i.days.ago ).each do |punch| # Dont use the cached version. # We might have changed if we were the combo punch.reload punch.combine_by_day end # by_hour punchable.punches.before( args[:by_hour_after].to_i.hours.ago ).each do |punch| # Dont use the cached version. # We might have changed if we were the combo punch.reload punch.combine_by_hour end end end end end