Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 避免因比赛条件而导致的超额预订_Mysql_Ruby On Rails_Activerecord - Fatal编程技术网

Mysql 避免因比赛条件而导致的超额预订

Mysql 避免因比赛条件而导致的超额预订,mysql,ruby-on-rails,activerecord,Mysql,Ruby On Rails,Activerecord,我们正在考虑预订系统,其中涉及两种模式:Store和reservation商店有最大座位和预订有客人计数列 为了避免超额预订,我们实施了验证。如果发生超额预订,交易将回滚。但我不确定在比赛条件下这是否足够简单 像这样: class Store < ActiveRecord::Base has_many :reservations validates :max_seats, presence: true, numericality: true end class Reservati

我们正在考虑预订系统,其中涉及两种模式:
Store
reservation
<代码>商店有
最大座位
预订
客人计数

为了避免超额预订,我们实施了验证。如果发生超额预订,交易将回滚。但我不确定在比赛条件下这是否足够简单

像这样:

class Store < ActiveRecord::Base
  has_many :reservations
  validates :max_seats, presence: true, numericality: true
end

class Reservation < ActiveRecord::Base
  belongs_to :store
  validates :guests_count, presence: true, numericality: true

  after_create do
    total_seats_taken = reservation_slot.reservations.sum(&:guests_count)
    unless total_seats_taken <= store.max_seats
      raise ActiveRecord::Rollback
    end
  end
end
类存储,->A提交事务->B在创建后执行
:B遇到
ActiveRecord::Rollback
异常

A启动事务->A在创建后执行<代码>->B在创建后执行<代码>提交事务:超售


如果您能分享任何见解,我将不胜感激。谢谢。

为什么不在创建之前使用一个?您可以按自己的方式进行,但如果不需要,为什么要开始将其写入数据库并引发异常呢