association_observers 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.travis.yml +1 -0
- data/Gemfile +6 -0
- data/README.md +57 -2
- data/Rakefile +18 -0
- data/association_observers.gemspec +3 -3
- data/lib/association_observers.rb +43 -31
- data/lib/association_observers/{activerecord.rb → active_record.rb} +15 -16
- data/lib/association_observers/{datamapper.rb → data_mapper.rb} +11 -20
- data/lib/association_observers/extensions/delayed_job.rb +13 -0
- data/lib/association_observers/extensions/resque.rb +30 -0
- data/lib/association_observers/extensions/sidekiq.rb +32 -0
- data/lib/association_observers/notifiers/base.rb +46 -21
- data/lib/association_observers/notifiers/propagation_notifier.rb +2 -2
- data/lib/association_observers/orm/active_record.rb +48 -0
- data/lib/association_observers/orm/base.rb +61 -0
- data/lib/association_observers/orm/data_mapper.rb +61 -0
- data/lib/association_observers/queue.rb +71 -0
- data/lib/association_observers/railtie.rb +11 -4
- data/lib/association_observers/ruby18.rb +26 -8
- data/lib/association_observers/version.rb +1 -1
- data/lib/association_observers/workers/many_delayed_notification.rb +41 -0
- data/spec/activerecord/association_observers_spec.rb +32 -1
- data/spec/activerecord/delayed_job/association_observers_spec.rb +8 -0
- data/spec/activerecord/readme_example_spec.rb +1 -1
- data/spec/activerecord/resque/association_observers_spec.rb +8 -0
- data/spec/activerecord/sidekiq/association_observers_spec.rb +8 -0
- data/spec/datamapper/association_observers_spec.rb +37 -2
- data/spec/{active_record_helper.rb → helpers/active_record_helper.rb} +4 -1
- data/spec/{datamapper_helper.rb → helpers/datamapper_helper.rb} +1 -1
- data/spec/helpers/delayed_job_helper.rb +26 -0
- data/spec/helpers/resque_helper.rb +5 -0
- data/spec/helpers/sidekiq_helper.rb +4 -0
- metadata +174 -156
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -5,6 +5,12 @@ group :development do
|
|
5
5
|
gem "yard", "0.8.2.1", :require => false
|
6
6
|
end
|
7
7
|
|
8
|
+
group :test do
|
9
|
+
gem "delayed_job_active_record", :require => false
|
10
|
+
gem "resque", :require => false
|
11
|
+
gem "sidekiq", :require => false unless RUBY_VERSION == "1.8.7"
|
12
|
+
end
|
13
|
+
|
8
14
|
gem 'activerecord'
|
9
15
|
gem 'datamapper'
|
10
16
|
gem 'dm-mysql-adapter'
|
data/README.md
CHANGED
@@ -169,7 +169,7 @@ The #observes method for the models accepts as argument the association being ob
|
|
169
169
|
|
170
170
|
The other important task is to define your own notifiers. First, where. For Rails, the gem expects a "notifiers" folder to exist under the "app" folder.
|
171
171
|
Everywhere else, it's entirely up to you where you should define them.
|
172
|
-
Second, how. Your notifier must inherit from Notifier::Base. This class provides you with
|
172
|
+
Second, how. Your notifier must inherit from Notifier::Base. This class provides you with hook methods you should/could redefine your way:
|
173
173
|
|
174
174
|
Methods to overwrite:
|
175
175
|
* action(observable, observer) : where you should define the behaviour which results of the observation of an event
|
@@ -190,10 +190,63 @@ Purpose of the Notifier is to abstract the behaviour from the Observer relations
|
|
190
190
|
need to complement/overwrite behaviour from your observer/observable models, you can write it in notifier-specific modules,
|
191
191
|
the ObserverMethods and the ObservableMethods, which will be included in the respective models.
|
192
192
|
|
193
|
+
### Background Queues
|
194
|
+
|
195
|
+
This gem supports the 3 most popular background queue implementations around: Delayed Job, Resque and Sidekiq. If you are
|
196
|
+
using this gem out of Rails, you can do:
|
197
|
+
|
198
|
+
AssociationObservers::options[:queue][:engine] = :delayed_job # or :sidekiq, or :resque
|
199
|
+
|
200
|
+
if in Rails, you can do it in application.rb:
|
201
|
+
|
202
|
+
module YourApp
|
203
|
+
class Application < Rails::Application
|
204
|
+
...
|
205
|
+
config.association_observers.queue.engine = :delayed_job # or :sidekiq, or :resque
|
206
|
+
...
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
and that's it. Why is this important? The notification of observer collections, when you don't rewrite the #notify_many hook
|
211
|
+
method of the notifier, takes the following approach:
|
212
|
+
|
213
|
+
* Queries the collection in batches (of 50, by default)
|
214
|
+
* Iterates over each batch
|
215
|
+
* Performs the #update hook method on each
|
216
|
+
|
217
|
+
It also takes this approach to the propagation. Batch-querying is much better than querying all at once, but you still
|
218
|
+
load everything and perform the various iterations synchronously. If you already use one of the aforementioned background
|
219
|
+
queues, each batch will generate a job which will be handled asynchronously. You also have the control over the batch size.
|
220
|
+
If you want to set a new default batch size, just:
|
221
|
+
|
222
|
+
# standard
|
223
|
+
AssociationObservers::options[:batch_size] = 200 # or 20...
|
224
|
+
|
225
|
+
# rails way
|
226
|
+
module YourApp
|
227
|
+
class Application < Rails::Application
|
228
|
+
...
|
229
|
+
config.association_observers.batch_size = 200 # or 20...
|
230
|
+
...
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
You can also set the queue name (default: "observers" and priority (if using delayed job) on the options, they are just another option under queue.
|
235
|
+
|
236
|
+
### Ruby Support
|
237
|
+
|
238
|
+
This gem is tested against the following rubies:
|
239
|
+
|
240
|
+
* 1.8.7
|
241
|
+
* 1.9.2
|
242
|
+
* 1.9.3
|
243
|
+
* 2.0.0
|
244
|
+
* rubinius
|
245
|
+
* jruby
|
246
|
+
|
193
247
|
### TODOs
|
194
248
|
|
195
249
|
* Support for other ORM's (currently supporting ActiveRecord and DataMapper)
|
196
|
-
* Support for other Message Queue libraries (only supporting DelayedJob, rescue, everything that "#delay"s)
|
197
250
|
* Action routine definition on the "#observes" declaration (sometimes one does not need the overhead of writing a notifier)
|
198
251
|
* Overall spec readability
|
199
252
|
|
@@ -205,6 +258,8 @@ the ObserverMethods and the ObservableMethods, which will be included in the res
|
|
205
258
|
* Support for ActiveRecord
|
206
259
|
* Support for DataMapper
|
207
260
|
|
261
|
+
* Integration with delayed job, resque and sidekiq
|
262
|
+
|
208
263
|
### Rails
|
209
264
|
|
210
265
|
The observer models have to be eager-loaded for the observer/observable behaviour to be extended in the respective associations.
|
data/Rakefile
CHANGED
@@ -10,6 +10,21 @@ RSpec::Core::RakeTask.new(:active_record_spec) do |t|
|
|
10
10
|
t.pattern = "spec/activerecord/*_spec.rb"
|
11
11
|
end
|
12
12
|
|
13
|
+
RSpec::Core::RakeTask.new(:active_record_delayed_job_spec) do |t|
|
14
|
+
t.rspec_opts = ['--options', "\"./.rspec\""]
|
15
|
+
t.pattern = "spec/activerecord/delayed_job/*_spec.rb"
|
16
|
+
end
|
17
|
+
|
18
|
+
RSpec::Core::RakeTask.new(:active_record_resque_spec) do |t|
|
19
|
+
t.rspec_opts = ['--options', "\"./.rspec\""]
|
20
|
+
t.pattern = "spec/activerecord/resque/*_spec.rb"
|
21
|
+
end
|
22
|
+
|
23
|
+
RSpec::Core::RakeTask.new(:active_record_sidekiq_spec) do |t|
|
24
|
+
t.rspec_opts = ['--options', "\"./.rspec\""]
|
25
|
+
t.pattern = "spec/activerecord/sidekiq/*_spec.rb"
|
26
|
+
end
|
27
|
+
|
13
28
|
RSpec::Core::RakeTask.new(:data_mapper_spec) do |t|
|
14
29
|
t.rspec_opts = ['--options', "\"./.rspec\""]
|
15
30
|
t.pattern = "spec/datamapper/*_spec.rb"
|
@@ -17,6 +32,9 @@ end
|
|
17
32
|
|
18
33
|
task :spec do |t|
|
19
34
|
Rake::Task["active_record_spec"].invoke rescue (failed = true)
|
35
|
+
Rake::Task["active_record_delayed_job_spec"].invoke rescue (failed = true)
|
36
|
+
Rake::Task["active_record_resque_spec"].invoke rescue (failed = true)
|
37
|
+
Rake::Task["active_record_sidekiq_spec"].invoke rescue (failed = true) unless RUBY_VERSION == "1.8.7"
|
20
38
|
Rake::Task["data_mapper_spec"].invoke rescue (failed = true)
|
21
39
|
raise "failed" if failed
|
22
40
|
end
|
@@ -25,10 +25,10 @@ Gem::Specification.new do |gem|
|
|
25
25
|
gem.require_paths = ["lib"]
|
26
26
|
|
27
27
|
gem.add_development_dependency("rake",["~> 0.9.2.2"])
|
28
|
-
gem.add_development_dependency("rack-test",["
|
28
|
+
gem.add_development_dependency("rack-test",["~> 0.6.2"])
|
29
29
|
gem.add_development_dependency("rspec",["~> 2.11.0"])
|
30
|
-
gem.add_development_dependency("database_cleaner",["
|
31
|
-
gem.add_development_dependency("colorize",["
|
30
|
+
gem.add_development_dependency("database_cleaner",["~> 0.8.0"])
|
31
|
+
gem.add_development_dependency("colorize",["~> 0.5.8"])
|
32
32
|
gem.add_development_dependency("pry")
|
33
33
|
gem.add_development_dependency("pry-doc")
|
34
34
|
gem.add_development_dependency("awesome_print")
|
@@ -7,6 +7,7 @@ require "association_observers/ruby18" if RUBY_VERSION < "1.9"
|
|
7
7
|
require "active_support/core_ext/array/extract_options"
|
8
8
|
require "active_support/core_ext/string/inflections"
|
9
9
|
|
10
|
+
|
10
11
|
# Here it is defined the basic behaviour of how observer/observable model associations are set. There are here three
|
11
12
|
# main roles defined: The observer associations, the observable associations, and the notifiers (the real observers).
|
12
13
|
# Observer Associations: those are the associations of an observable which will be "listening/observing" to updates
|
@@ -24,34 +25,30 @@ require "active_support/core_ext/string/inflections"
|
|
24
25
|
#
|
25
26
|
# @author Tiago Cardoso
|
26
27
|
module AssociationObservers
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
def self.check_new_record_method
|
31
|
-
raise "should be defined in an adapter for the used ORM"
|
28
|
+
autoload :Queue, "association_observers/queue"
|
29
|
+
module Workers
|
30
|
+
autoload :ManyDelayedNotification, "association_observers/workers/many_delayed_notification"
|
32
31
|
end
|
33
32
|
|
34
|
-
|
35
|
-
|
36
|
-
def self.fetch_model_from_collection
|
37
|
-
raise "should be defined in an adapter for the used ORM"
|
33
|
+
def self.orm_adapter
|
34
|
+
raise "no adapter for your ORM"
|
38
35
|
end
|
39
36
|
|
40
|
-
|
41
|
-
|
42
|
-
def self.batched_each(collection, batch, &block)
|
43
|
-
raise "should be defined in an adapter for the used ORM"
|
37
|
+
def self.queue
|
38
|
+
@queue ||= Queue.instance
|
44
39
|
end
|
45
40
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
41
|
+
@default_options = {
|
42
|
+
:batch_size => 50,
|
43
|
+
:queue => {
|
44
|
+
:engine => nil,
|
45
|
+
:name => "observers",
|
46
|
+
:priority => nil
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
def self.options
|
51
|
+
@options ||= @default_options.dup
|
55
52
|
end
|
56
53
|
|
57
54
|
|
@@ -62,11 +59,24 @@ module AssociationObservers
|
|
62
59
|
|
63
60
|
# Methods to be added to observer associations
|
64
61
|
module IsObserverMethods
|
65
|
-
def self.included(base)
|
62
|
+
def self.included(base)
|
63
|
+
base.extend(ClassMethods)
|
64
|
+
AssociationObservers::orm_adapter.class_variable_set(base, :observable_options)
|
65
|
+
if RUBY_VERSION < "1.9"
|
66
|
+
base.observable_options = AssociationObservers::Backports.hash_select(AssociationObservers::options){|k, v| [:batch_size].include?(k) }
|
67
|
+
else
|
68
|
+
base.observable_options = AssociationObservers::options.select{|k, v| [:batch_size].include?(k) }
|
69
|
+
end
|
70
|
+
end
|
66
71
|
|
67
72
|
module ClassMethods
|
68
73
|
def observer? ; true ; end
|
69
74
|
|
75
|
+
def batch_size=(val)
|
76
|
+
raise "AssociationObservers: it must be an integer value" unless val.is_a?(Fixnum)
|
77
|
+
self.observable_options[:batch_size] = val
|
78
|
+
end
|
79
|
+
|
70
80
|
private
|
71
81
|
|
72
82
|
# @abstract
|
@@ -139,7 +149,9 @@ module AssociationObservers
|
|
139
149
|
end
|
140
150
|
end
|
141
151
|
|
152
|
+
# blocks the observable behaviour
|
142
153
|
def unobservable! ; @unobservable = true ; end
|
154
|
+
# unblocks the observable behaviour
|
143
155
|
def observable! ; @unobservable = false ; end
|
144
156
|
|
145
157
|
private
|
@@ -147,7 +159,7 @@ module AssociationObservers
|
|
147
159
|
# informs the observers that something happened on this observable, passing all the observers to it
|
148
160
|
# @param [Symbol] callback key of the callback being notified; only the observers for this callback will be run
|
149
161
|
def notify! callback
|
150
|
-
notify_observers(callback) unless @unobservable
|
162
|
+
notify_observers([callback, []]) unless @unobservable
|
151
163
|
end
|
152
164
|
end
|
153
165
|
|
@@ -185,9 +197,7 @@ module AssociationObservers
|
|
185
197
|
observer_callbacks = Array(opts[:on] || [:save, :destroy])
|
186
198
|
|
187
199
|
# no observer, how are you supposed to observe?
|
188
|
-
AssociationObservers::validate_parameters(self, args, notifier_classes, observer_callbacks)
|
189
|
-
|
190
|
-
|
200
|
+
AssociationObservers::orm_adapter.validate_parameters(self, args, notifier_classes, observer_callbacks)
|
191
201
|
|
192
202
|
|
193
203
|
notifier_classes.map!{|notifier_class|notifier_class.to_s.classify.constantize} << PropagationNotifier
|
@@ -198,7 +208,7 @@ module AssociationObservers
|
|
198
208
|
end
|
199
209
|
|
200
210
|
# 1: for each observed association, define behaviour
|
201
|
-
get_association_options_pairs(args).each do |klass, options|
|
211
|
+
get_association_options_pairs(args).each do |name, klass, options|
|
202
212
|
klass.instance_eval do
|
203
213
|
|
204
214
|
include IsObservableMethods
|
@@ -208,7 +218,7 @@ module AssociationObservers
|
|
208
218
|
attr_reader :unobservable
|
209
219
|
|
210
220
|
# load observers from this observable association
|
211
|
-
set_observers(notifier_classes, observer_callbacks, observer_class, (options[:as] || association_name).to_s)
|
221
|
+
set_observers(notifier_classes, observer_callbacks, observer_class, (options[:as] || association_name).to_s, name)
|
212
222
|
|
213
223
|
# sets the callbacks to inform observers
|
214
224
|
set_notification_on_callbacks(observer_callbacks)
|
@@ -229,6 +239,8 @@ end
|
|
229
239
|
if defined?(Rails::Railtie) # RAILS
|
230
240
|
require 'association_observers/railtie'
|
231
241
|
else
|
232
|
-
|
233
|
-
require 'association_observers/
|
242
|
+
# ORM Adapters
|
243
|
+
require 'association_observers/active_record' if defined?(ActiveRecord)
|
244
|
+
require 'association_observers/data_mapper' if defined?(DataMapper)
|
245
|
+
|
234
246
|
end
|
@@ -2,20 +2,12 @@
|
|
2
2
|
if defined?(ActiveRecord)
|
3
3
|
|
4
4
|
module AssociationObservers
|
5
|
-
|
6
|
-
:
|
5
|
+
module Orm
|
6
|
+
autoload :ActiveRecord, "association_observers/orm/active_record"
|
7
7
|
end
|
8
8
|
|
9
|
-
def self.
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.batched_each(collection, batch, &block)
|
14
|
-
collection.find_each(:batch_size => batch, &block)
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.validate_parameters(observer, observable_associations, notifier_names, callbacks)
|
18
|
-
raise "Invalid callback; possible options: :create, :update, :save, :destroy" unless callbacks.all?{|o|[:create,:update,:save,:destroy].include?(o.to_sym)}
|
9
|
+
def self.orm_adapter
|
10
|
+
@orm_adapter ||= Orm::ActiveRecord
|
19
11
|
end
|
20
12
|
|
21
13
|
# translation of AR callbacks to collection callbacks; we want to ignore the update on collections because neither
|
@@ -36,7 +28,12 @@ if defined?(ActiveRecord)
|
|
36
28
|
|
37
29
|
private
|
38
30
|
|
39
|
-
|
31
|
+
# given the fetched information, it initializes the notifiers
|
32
|
+
# @param [Array] notifiers notifiers for the current class
|
33
|
+
# @param [Array] callbacks valid callbacks for the notifiers
|
34
|
+
# @param [Class] observer_class the class of the observer
|
35
|
+
# @param [Symbol] association_name the observer identifier on the observable
|
36
|
+
def set_observers(notifiers, callbacks, observer_class, association_name, observable_association_name)
|
40
37
|
notifiers.each do |notifier|
|
41
38
|
callbacks.each do |callback|
|
42
39
|
options = {}
|
@@ -44,6 +41,8 @@ if defined?(ActiveRecord)
|
|
44
41
|
self.reflect_on_association(association_name.pluralize.to_sym)
|
45
42
|
options[:observer_class] = observer_class.base_class if observer_association.options[:polymorphic]
|
46
43
|
|
44
|
+
options[:observable_association_name] = observable_association_name
|
45
|
+
|
47
46
|
self.add_observer notifier.new(callback, observer_association.name, options)
|
48
47
|
include "#{notifier.name}::ObservableMethods".constantize if notifier.constants.map(&:to_sym).include?(:ObservableMethods)
|
49
48
|
end
|
@@ -74,7 +73,7 @@ if defined?(ActiveRecord)
|
|
74
73
|
private
|
75
74
|
|
76
75
|
def get_association_options_pairs(association_names)
|
77
|
-
reflect_on_all_associations.select{ |r| association_names.include?(r.name) }.map{|r| [r.klass, r.options] }
|
76
|
+
reflect_on_all_associations.select{ |r| association_names.include?(r.name) }.map{|r| [r.name, r.klass, r.options] }
|
78
77
|
end
|
79
78
|
|
80
79
|
def filter_collection_associations(associations)
|
@@ -113,8 +112,8 @@ if defined?(ActiveRecord)
|
|
113
112
|
|
114
113
|
# bullshit ruby 1.8 can't stringify hashes, arrays, symbols nor strings correctly
|
115
114
|
if RUBY_VERSION < "1.9"
|
116
|
-
assoc_options = AssociationObservers::extended_to_s(a.options)
|
117
|
-
callback_options = AssociationObservers::extended_to_s(callbacks)
|
115
|
+
assoc_options = AssociationObservers::Backports::extended_to_s(a.options)
|
116
|
+
callback_options = AssociationObservers::Backports::extended_to_s(callbacks)
|
118
117
|
else
|
119
118
|
assoc_options = a.options.to_s
|
120
119
|
callback_options = callbacks
|
@@ -1,24 +1,12 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
if defined?(DataMapper)
|
3
3
|
module AssociationObservers
|
4
|
-
|
5
|
-
:
|
4
|
+
module Orm
|
5
|
+
autoload :DataMapper, "association_observers/orm/data_mapper"
|
6
6
|
end
|
7
7
|
|
8
|
-
def self.
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.batched_each(collection, batch, &block)
|
13
|
-
collection.each(&block) # datamapper batches already by 500 https://groups.google.com/forum/?fromgroups=#!searchin/datamapper/batches/datamapper/lAZWFN4TWAA/G1Gu-ams_QMJ
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.validate_parameters(observer, observable_associations, notifier_names, callbacks)
|
17
|
-
observable_associations.each do |o|
|
18
|
-
if observer.relationships[o].is_a?(DataMapper::Associations::ManyToMany::Relationship)
|
19
|
-
warn "this gem does not currently support observation behaviour for many to many relationships"
|
20
|
-
end
|
21
|
-
end
|
8
|
+
def self.orm_adapter
|
9
|
+
@orm_adapter ||= Orm::DataMapper
|
22
10
|
end
|
23
11
|
|
24
12
|
module IsObservableMethods
|
@@ -33,12 +21,15 @@ if defined?(DataMapper)
|
|
33
21
|
end
|
34
22
|
private
|
35
23
|
|
36
|
-
def set_observers(ntfs, callbacks, observer_class, association_name)
|
24
|
+
def set_observers(ntfs, callbacks, observer_class, association_name, observable_association_name)
|
37
25
|
ntfs.each do |notifier|
|
38
26
|
callbacks.each do |callback|
|
39
27
|
options = {} # todo: use this for polymorphics
|
40
28
|
observer_association = self.relationships[association_name]||
|
41
29
|
self.relationships[association_name.pluralize]
|
30
|
+
|
31
|
+
options[:observable_association_name] = observable_association_name
|
32
|
+
|
42
33
|
notifiers << notifier.new(callback, observer_association.name, options)
|
43
34
|
include "#{notifier.name}::ObservableMethods".constantize if notifier.constants.map(&:to_sym).include?(:ObservableMethods)
|
44
35
|
end
|
@@ -61,8 +52,8 @@ if defined?(DataMapper)
|
|
61
52
|
private
|
62
53
|
|
63
54
|
|
64
|
-
def notify_observers(
|
65
|
-
self.class.notifiers.each{|notifier| notifier.update(
|
55
|
+
def notify_observers(args)
|
56
|
+
self.class.notifiers.each{|notifier| notifier.update(args, self)}
|
66
57
|
end
|
67
58
|
end
|
68
59
|
end
|
@@ -79,7 +70,7 @@ if defined?(DataMapper)
|
|
79
70
|
|
80
71
|
def get_association_options_pairs(association_names)
|
81
72
|
# TODO: find better way to figure out the class of the relationship entity
|
82
|
-
relationships.select{|r|association_names.include?(r.name)}.map{|r| [(r.is_a?(DataMapper::Associations::ManyToOne::Relationship) ? r.parent_model : r.child_model), r.options] }
|
73
|
+
relationships.select{|r|association_names.include?(r.name)}.map{|r| [r.name, (r.is_a?(DataMapper::Associations::ManyToOne::Relationship) ? r.parent_model : r.child_model), r.options] }
|
83
74
|
end
|
84
75
|
|
85
76
|
def filter_collection_associations(associations)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module AssociationObservers
|
4
|
+
class Queue
|
5
|
+
private
|
6
|
+
|
7
|
+
# overwriting the enqueue method. Delayed Job enqueues the jobs already itself
|
8
|
+
def enqueue(task, *args)
|
9
|
+
job = task.new(*args)
|
10
|
+
Delayed::Job.enqueue job, :queue => AssociationObservers::options[:queue][:name], :priority => AssociationObservers::options[:queue][:priority] || Delayed::Worker.default_priority
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|