tI在我的Rails應用程序中有一個Player模型。我正在評估的2列是highestLevel和highestScore。這是一個跨多個配置文件跟蹤單個玩家的統計數據,因此這些值中的任何一個都可能低於db中的當前值。因此,如果傳入的發佈值大於數據庫中的發佈值,我只希望它更新特定列。閱讀一些內置的驗證選項,我無法按照我的意圖工作,但是,我能夠編寫自己的驗證工作,但是以調用Player.find(id)爲代價該模型。有沒有辦法解決這個問題,這樣我的Player.update()不會導致UPDATE和SELECT?Rails 4個別列上的before_update條件SQL開銷
這裏是我的模型:
class Player < ActiveRecord::Base
#validates_numericality_of :highestLevel, greater_than: Proc.new { |r| r.highestLevel }
#validates_numericality_of :highestScore, greater_than: Proc.new { |r| r.highestScore }
before_update :player_record, :eval_highestLevel, :eval_highestScore
# TODO: Find a more effective way to handle update evaluations with less SQL overhead
private
def eval_highestLevel
# if highestLevel in DB has higher value , update the value
if @p.highestLevel > self.highestLevel
self.highestLevel = @p.highestLevel
end
end
def eval_highestScore
# if record in DB has higher value , update the value
if @p.highestScore > self.highestScore
self.highestScore = @p.highestScore
end
end
def player_record
@p = Player.find(id)
end
end
如何使這個更高效的任何想法,或者我應該息事寧人?我一直在爲Rails 4.x尋找更大,更好的鼠標陷阱
豈不'@ p'和'self'是一回事嗎?還是說很多東西都與背後的'highestScore'搞混了,所以你需要把它從數據庫中取出來看看你是否需要改變它?如果是這樣,那麼正確的解決方案將使用觸發器將該邏輯放入數據庫中,以便更容易避免競爭條件。 – 2014-09-05 17:17:32