首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AASM不触发ActiveRecord::Rollback

AASM不触发ActiveRecord::Rollback
EN

Stack Overflow用户
提问于 2018-11-15 09:41:58
回答 1查看 484关注 0票数 0

我在预订模型中有批准的事件枚举。我得到了before_validation的认可

在我的model/booking.rb中,我添加了自定义验证

代码语言:javascript
复制
    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

在我的控制器里,我给服务部门打电话

代码语言:javascript
复制
 @service = Manage::BookingApprovalService.new({booking: @booking})
 @service.run

app/services/manage/booking_approval_service

代码语言:javascript
复制
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邮件仍在调用。

如果我从booking.approve!中得到错误,为什么服务不回滚?

EN

回答 1

Stack Overflow用户

发布于 2018-11-15 10:30:42

只有在引发异常时,事务块才会回滚。

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53316467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档