Używam gem aasm_state wraz z sidekiq. Oto co customer.rb wygląda na definicji aasm_state:Wartość zostaje ustawiona, mimo że before_save ustawia ją na zero
aasm do
state :closed, initial: true
state :open
state :claimed
event :open do
transitions from: :closed, to: :open
end
event :claim do
transitions from: [:open, :closed], to: :claimed
end
event :close do
transitions from: [:open, :claimed], to: :closed
before do
self.user_id = nil
end
end
end
a potem także w customer.rb:
def properly_close
if closed? && user_id
Rails.logger.info "Bad customer state with customer_id: #{id} at #{Time.now} and the last message was at #{messages.last.created_at}. Aasm_state_was: #{aasm_state_was}"
self.user_id = nil
end
end
ilekroć aasm_state == 'zamknięte', nigdy nie powinno być user_id na kliencie. Jednak nadal często się zdarza. Myślę, że to ma coś wspólnego z pracą sidekiq równolegle, ale po prostu nie jestem pewien. Nawet z moich dwóch sposobów upewniając user_id = nil (w przed zrobić i properly_close), to i tak kończy się coraz set aasm_state == „zamknięte” & & USER_ID
Jak to możliwe? Jak mogę się dowiedzieć, jak to się dzieje?
Czy masz * lock_version * kolumny w tabeli? Spróbuj dodać, aby włączyć wbudowany optymistyczny mechanizm blokujący, dodając tę kolumnę. Przynajmniej może pomóc dowiedzieć się więcej ponownego współbieżnego dostępu do tej tabeli. – Anatoly
Dam ci spróbować. Jednak tylko myśląc o tym, jak działa activerecord/sidekiq, jeśli poszczególne wartości każdego zadania nigdy nie mogą być aasm_state = closed && user_id not nil, staram się zrozumieć, w jaki sposób może to być współistnienie. –
Czy używasz 'update_attribute', aby ustawić stan bezpośrednio? "update_attribute" obejmie sprawdzanie poprawności i wywołania zwrotne. – nathanvda