我在预订模型中有批准的事件枚举。我得到了before_validation的认可
在我的model/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.runapp/services/manage/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邮件仍在调用。
如果我从booking.approve!中得到错误,为什么服务不回滚?
发布于 2018-11-15 10:30:42
只有在引发异常时,事务块才会回滚。
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
https://stackoverflow.com/questions/53316467
复制相似问题