2014-02-21 41 views
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 

現在讓我們說我有一個現有的宋實例,我嘗試更新它。這裏沒有比賽條件嗎?具體做法是:

  1. 運行首歌驗證,一切都經過
  2. 歌曲創建採購並保存到數據庫
  3. 保存歌曲DB

我怎樣才能防止這種情況發生?我不知道如何在這種情況下使用鎖,因爲購買是has_many。

謝謝!

+0

什麼是「競賽條件」? – MrYoshiji

+0

「競爭條件」是兩個過程分開發生的情況,並且由於您不知道哪一個會先發生,您會得到不可預知的結果。但我不認爲這是一個競爭條件的例子。 –

+0

在歌曲驗證通過之後和歌曲在數據庫中實際更新之前,無法購買這首歌曲?具體來說,在驗證檢查中調用self.purchases的值可能會更改。對? – deruse

回答

0

購買會影響購買模式,歌曲更新會影響歌曲模型。
由於ActiveRecord將這些模型映射到數據庫中的單獨表中,因此不分別存取「競爭條件」。

但是,我看你是否要刪除一首歌曲,所做的任何購買都會引發錯誤。 針對該場景而不是UPDATE。

此外,但這應該是標準的,不要更新您的歌曲的主鍵。