Migrated after_* callbacks to after_commit to avoid race conditions between cache creation and database insert/update. See: http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html\#module-ActiveRecord::Transactions::ClassMethods-label-Callbacks .

This commit is contained in:
Thorsten Eckel 2018-06-05 12:37:52 +02:00
parent 809a698c03
commit 11e63fe21a
5 changed files with 14 additions and 18 deletions

View file

@ -4,11 +4,7 @@ module ApplicationModel::HasCache
included do
before_create :cache_delete
after_create :cache_delete
after_update :cache_delete
after_touch :cache_delete
after_destroy :cache_delete
after_commit :cache_delete
end
def cache_update(other)

View file

@ -120,12 +120,12 @@ class Observer::Transaction < ActiveRecord::Observer
# simulate article create as ticket update
article = nil
if event[:object] == 'Ticket::Article'
article = Ticket::Article.lookup(id: event[:id])
article = Ticket::Article.find_by(id: event[:id])
next if !article
next if event[:type] == 'update'
# set new event infos
ticket = Ticket.lookup(id: article.ticket_id)
ticket = Ticket.find_by(id: article.ticket_id)
event[:object] = 'Ticket'
event[:id] = ticket.id
event[:type] = 'update'
@ -133,7 +133,7 @@ class Observer::Transaction < ActiveRecord::Observer
end
# get current state of objects
object = Kernel.const_get(event[:object]).lookup(id: event[:id])
object = Kernel.const_get(event[:object]).find_by(id: event[:id])
# next if object is already deleted
next if !object

View file

@ -591,7 +591,7 @@ condition example
elsif selector['pre_condition'] == 'current_user.organization_id'
raise "Use current_user.id in selector, but no current_user is set #{selector.inspect}" if !current_user_id
query += "#{attribute} IN (?)"
user = User.lookup(id: current_user_id)
user = User.find_by(id: current_user_id)
bind_params.push user.organization_id
else
# rubocop:disable Style/IfInsideElse
@ -624,7 +624,7 @@ condition example
end
elsif selector['pre_condition'] == 'current_user.organization_id'
query += "#{attribute} NOT IN (?)"
user = User.lookup(id: current_user_id)
user = User.find_by(id: current_user_id)
bind_params.push user.organization_id
else
# rubocop:disable Style/IfInsideElse
@ -807,7 +807,7 @@ perform changes on ticket
logger.debug { "Perform #{perform_origin} #{perform.inspect} on Ticket.find(#{id})" }
article = begin
Ticket::Article.lookup(id: item.try(:dig, :article_id))
Ticket::Article.find_by(id: item.try(:dig, :article_id))
rescue ArgumentError
nil
end
@ -847,18 +847,18 @@ perform changes on ticket
elsif article.from.present?
recipients_raw.push(article.from)
elsif article.origin_by_id
email = User.lookup(id: article.origin_by_id).email
email = User.find_by(id: article.origin_by_id).email
recipients_raw.push(email)
elsif article.created_by_id
email = User.lookup(id: article.created_by_id).email
email = User.find_by(id: article.created_by_id).email
recipients_raw.push(email)
end
end
elsif recipient == 'ticket_customer'
email = User.lookup(id: customer_id).email
email = User.find_by(id: customer_id).email
recipients_raw.push(email)
elsif recipient == 'ticket_owner'
email = User.lookup(id: owner_id).email
email = User.find_by(id: owner_id).email
recipients_raw.push(email)
elsif recipient == 'ticket_agents'
User.group_access(group_id, 'full').sort_by(&:login).each do |user|

View file

@ -29,10 +29,10 @@ class Transaction::Trigger
return if @item[:object] != 'Ticket'
ticket = Ticket.lookup(id: @item[:object_id])
ticket = Ticket.find_by(id: @item[:object_id])
return if !ticket
if @item[:article_id]
article = Ticket::Article.lookup(id: @item[:article_id])
article = Ticket::Article.find_by(id: @item[:article_id])
end
original_user_id = UserInfo.current_user_id

View file

@ -19,7 +19,7 @@ class UserGroup < ApplicationModel
def cache_delete
group.cache_update(nil)
user.cache_update(nil)
user.cache_update(nil) if user.present?
super
end