0
我想澄清一些關於ActiveRecord的內容。假設我有這樣的場景:驗證中的ActiveRecord競爭條件
class Purchase < ActiveRecord::Base
belongs_to :song
end
class Song < ActiveRecord::Base
has_many :purchases
validate :cannot_update_if_being_sold
def cannot_update_if_being_sold
errors.add(:song, "Cannot update beats while beat is being sold.") if !self.purchases.empty?
end
end
現在讓我們說我有一個現有的宋實例,我嘗試更新它。這裏沒有比賽條件嗎?具體做法是:
- 運行首歌驗證,一切都經過
- 歌曲創建採購並保存到數據庫
- 保存歌曲DB
我怎樣才能防止這種情況發生?我不知道如何在這種情況下使用鎖,因爲購買是has_many。
謝謝!
什麼是「競賽條件」? – MrYoshiji
「競爭條件」是兩個過程分開發生的情況,並且由於您不知道哪一個會先發生,您會得到不可預知的結果。但我不認爲這是一個競爭條件的例子。 –
在歌曲驗證通過之後和歌曲在數據庫中實際更新之前,無法購買這首歌曲?具體來說,在驗證檢查中調用self.purchases的值可能會更改。對? – deruse