Skip to content

Commit ec03a70

Browse files
committed
add rails/perform_job_in_after_commit_callback snippet
1 parent 414674a commit ec03a70

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

lib/rails/perform_job_in_after_commit_callback.rb

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,32 @@ def send_notification
3838
within_files Synvert::RAILS_MODEL_FILES do
3939
find_node '.class_node' do
4040
callback_names_with_actions = {}
41+
job_performed_def_names = []
4142

4243
find_node node_type: 'call_node', receiver: nil, name: { in: %i[after_create after_update after_save] } do
4344
callback_names_with_actions[node.arguments.arguments.first.to_value.to_s] =
4445
NodeMutation::ReplaceAction.new(node, :name, with: '{{name}}_commit', adapter: mutation_adapter)
4546
end
4647

47-
find_node node_type: 'def_node', name: { in: callback_names_with_actions.keys } do
48+
find_node node_type: 'def_node' do
4849
if_exist_node ".call_node[receiver=~/\\A(#{job_classes.join('|')})/][name IN (perform_later perform_async perform_in perform_at)]" do
49-
add_action(callback_names_with_actions[node.name.to_s])
50+
job_performed_def_names << node.name.to_s
5051
end
5152
if_exist_node ".call_node[receiver=~/\\A(#{mailer_classes.join('|')})/][name=deliver_later]" do
52-
add_action(callback_names_with_actions[node.name.to_s])
53+
job_performed_def_names << node.name.to_s
54+
end
55+
end
56+
57+
class_definition = definitions.find_class_by_full_name(node.full_name)
58+
callback_names_with_actions.each do |callback_name, action|
59+
if job_performed_def_names.include?(callback_name)
60+
add_action(action)
61+
next
62+
end
63+
64+
method_definition = class_definition.find_method_by_name(callback_name)
65+
if method_definition && method_definition.call_any_method?(job_performed_def_names)
66+
add_action(action)
5367
end
5468
end
5569
end

spec/rails/perform_job_in_after_commit_callback_spec.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,16 @@ class User < ApplicationRecord
6262
after_save :update_cache
6363
6464
def send_notification
65-
NotificationJob.perform_async(self)
65+
notify_user
6666
end
6767
6868
def update_cache
6969
Cache.update(self)
7070
end
71+
72+
def notify_user
73+
NotificationJob.perform_async(self)
74+
end
7175
end
7276
EOF
7377
let(:test_rewritten_contents) { [<<~EOF.strip, <<~EOF.strip] }
@@ -83,12 +87,16 @@ class User < ApplicationRecord
8387
after_save :update_cache
8488
8589
def send_notification
86-
NotificationJob.perform_async(self)
90+
notify_user
8791
end
8892
8993
def update_cache
9094
Cache.update(self)
9195
end
96+
97+
def notify_user
98+
NotificationJob.perform_async(self)
99+
end
92100
end
93101
EOF
94102

0 commit comments

Comments
 (0)