2013-02-19 47 views
-1

我试图确保玩家id的顺序被保存在一个一致的方式,所以我们可以有他们的复合索引。播放器id在before_validation回调结束时在验证处理程序中切换,但在before_save中返回其旧值,并使用预切换值保存到数据库中。我如何确保正确的顺序使其进入数据库?Ruby on Rails更改before_validation关联ID未保存

class Game < ActiveRecord::Base 

    belongs_to :player_0, :class_name => "User", :foreign_key => "player_0_id", :inverse_of => :games 
    belongs_to :player_1, :class_name => "User", :foreign_key => "player_1_id", :inverse_of => :games 
    before_validation :ensure_player_order 

private 

def ensure_player_order 
    if self.player_0_id.nil? 
     self.player_1_id = self.player_0_id 
     self.player_1_id = nil 
    elsif !self.player_1_id.nil? 
     ids = [self.player_0_id,self.player_1_id] 
     low_id = ids.min 
     high_id = ids.max 

     self.player_0_id = User.find(low_id) 
     self.player_1_id = User.find(high_id) 
    end 
end 
end 
+0

不知道为什么这是越来越downvoted .... – insomniac2846 2013-02-19 05:57:28

回答

0
因为你必须更新关联,不是国外的ID与联想(我认为这与::加载ActiveModel肮脏的做拉一些恶作剧,但我不知道配对的player_0和PLAYER_1利用协会

)。因此请将ensure_player_order更改为。

def ensure_player_order 
    if self.player_0.nil? 
     self.player_1 = self.player_0 
     self.player_1 = nil 
    elsif !self.player_1.nil? 
     low = self.player_0.id < self.player_1.id ? self.player_0 : self.player_1 
     high = self.player_0.id < self.player_1.id ? self.player_1 : self.player_0 

     self.player_0 = low 
     self.player_1 = high 
    end 
    true 
    end