/
active_record.rb
43 lines (37 loc) · 1.32 KB
/
active_record.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# frozen_string_literal: true
require "sidekiq/extensions/generic_proxy"
module Sidekiq
module Extensions
##
# Adds +delay+, +delay_for+ and +delay_until+ methods to ActiveRecord to offload instance method
# execution to Sidekiq.
#
# @example
# User.recent_signups.each { |user| user.delay.mark_as_awesome }
#
# Please note, this is not recommended as this will serialize the entire
# object to Redis. Your Sidekiq jobs should pass IDs, not entire instances.
# This is here for backwards compatibility with Delayed::Job only.
class DelayedModel
include Sidekiq::Worker
def perform(yml)
(target, method_name, args) = YAML.load(yml)
target.__send__(method_name, *args)
end
end
module ActiveRecord
def sidekiq_delay(options = {})
Proxy.new(DelayedModel, self, options)
end
def sidekiq_delay_for(interval, options = {})
Proxy.new(DelayedModel, self, options.merge("at" => Time.now.to_f + interval.to_f))
end
def sidekiq_delay_until(timestamp, options = {})
Proxy.new(DelayedModel, self, options.merge("at" => timestamp.to_f))
end
alias_method :delay, :sidekiq_delay
alias_method :delay_for, :sidekiq_delay_for
alias_method :delay_until, :sidekiq_delay_until
end
end
end