AASM не запускает ActiveRecord :: откат - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть утверждение перечисление события в модели бронирования. У меня есть утверждение before_validation

в моей модели / booking.rb Я добавил пользовательскую проверку

    include AASM

    before_validation :item_availability, if: :approved?

    enum status: [:pending, :approved, :rejected, :on_loan, :returned]

    aasm column: :status, enum: true do

       state :pending, initial: true
       state :approved
       state :rejected
       state :on_loan
       state :returned    

       event :approve do
         transitions from: :pending, to: :approved
       end

       event :reject do
         transitions from: :pending, to: :rejected
       end

       event :on_loan do
         transitions from: :approved, to: :on_loan
       end

       event :returned do
         transitions from: :on_loan, to: :returned
       end

  end


  private

  def item_availability
    if item.quantity.to_f < quantity.to_f
      errors.add(:base, "Not enough quantity for #{item.name} only #{item.quantity} left")
      false
    end
  end

и в моем контроллере я звоню в сервис

 @service = Manage::BookingApprovalService.new({booking: @booking})
 @service.run

приложение / услуги / управление / booking_approval_service

class Manage::BookingApprovalService < BaseService

  attr_accessor :booking

  def run
    Booking.transaction do
      booking.approve! // I confirmed that I'm getting the false here 
      booking.item.decrement!(:quantity, booking.quantity)
      BookingsMailer.send_approval(booking).deliver_now
    end
  end

end

Я получаю ложь, когда отлаживаю booking.approve! , потому что количество, указанное в бронировании, превышает количество товара.

Но из службы. декремент! и send_approval mail все еще вызывается.

Почему сервис не откатывается, если я получаю ложь от booking.approve!

1 Ответ

0 голосов
/ 15 ноября 2018

Блок транзакции будет откатываться только в случае возникновения исключения.

def run
  Booking.transaction do
    fail(ActiveRecord::Rollback) unless booking.approve! 
    booking.item.decrement!(:quantity, booking.quantity)
    BookingsMailer.send_approval(booking).deliver_now
  end
end

Документы: https://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

...