2015-06-26 16 views
6

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?

+0

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

+0

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. –

+0

Czy używasz 'update_attribute', aby ustawić stan bezpośrednio? "update_attribute" obejmie sprawdzanie poprawności i wywołania zwrotne. – nathanvda

Odpowiedz

4

W obu przypadkach trzeba save aktualizację, tj:

self.user_id = nil 
self.save 

Albo bardziej zwięzły (i omijając wywołania zwrotne):

self.update_attribute :user_id, nil 
Powiązane problemy