我有一個非常簡單的Rails 3應用程序,用戶可以在其中爲特定日期保留有限數量的同類項目。我試圖避免兩個人在某一天保留最後一個項目的競賽狀態。該模型(簡化)如下:Rails 3 - 潛在的比賽條件?
class Reservation < ActiveRecord::Base
belongs_to :user
attr_accessible :date
MAX_THINGS_AVAILABLE = 20
validate :check_things_available
def check_things_available
unless things_available? errors[:base] << "No things available"
end
def things_available?
Reservation.find_all_by_date(date).count < MAX_THINGS_AVAILABLE
end
end
預約正在控制器通過current_user.reservations.build(params[:reservation])
感覺就像有一個更好的方式來做到這一點創建的,但我不能完全把我的指着它是什麼。任何有關如何防止競賽狀況的幫助將不勝感激。
在http://api.rubyonrails.org/classes/ActiveRecord/Locking/Optimistic.html看一看你提供 – Gazler
鏈接引用更新屬性/列在現有記錄中,並且當創建兩個新記錄時,我的競賽狀況將發生。我錯過了什麼嗎?另外,我不清楚在這種情況下行級鎖定是否會起作用,因爲我使用從所有行的子集派生的計數。 –
我認爲在過濾器之前使用是最簡單的方法。如果它們返回錯誤,則整個交易將被取消。 – Spyros