44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
# File 'lib/custom_counter_cache/model.rb', line 44
def update_counter_cache(association, cache_column, options = {})
return unless table_exists?
association = association.to_sym
cache_column = cache_column.to_sym
method_name = "callback_#{association}_#{cache_column}".to_sym
reflection = reflect_on_association(association)
foreign_key = reflection.try(:foreign_key) || reflection.association_foreign_key
define_method method_name do
rails_5_1_or_newer = ActiveModel.version >= Gem::Version.new('5.1.0')
target_key = reflection.options[:polymorphic] ? "#{association}_type" : foreign_key
target_changed = rails_5_1_or_newer ? send("saved_change_to_#{target_key}?") : send("#{target_key}_changed?")
if target_changed
old_id = rails_5_1_or_newer ? send("#{target_key}_before_last_save") : send("#{target_key}_was")
klass = if reflection.options[:polymorphic]
( old_id || send("#{association}_type") ).constantize
else
reflection.klass
end
if ( old_id && record = klass.find_by(id: old_id) )
record.send("update_#{cache_column}")
end
end
if ( record = send(association) )
record.send("update_#{cache_column}")
end
end
skip_callback = Proc.new { |callback, opts|
(opts[:except].present? && opts[:except].include?(callback)) ||
(opts[:only].present? && !opts[:only].include?(callback))
}
after_create method_name, options unless skip_callback.call(:create, options)
after_update method_name, options unless skip_callback.call(:update, options)
after_destroy method_name, options unless skip_callback.call(:destroy, options)
rescue StandardError => e
raise e unless ENV['DATABASE_URL'].to_s.include?('//user:[email protected]/')
end
|