Ruby on Rails在未保存关联ID的before_validation中发生更改

时间:2013-02-19 03:08:30

标签: ruby-on-rails model associations

我正在努力确保玩家ID的顺序以一致的方式保存,以便我们可以对它们进行复合索引。播放器ID在before_validation回调结束时和验证处理程序中切换,但在before_save中返回其旧值,并使用预切换值保存到数据库。如何确保正确的排序进入数据库?

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

1 个答案:

答案 0 :(得分:0)

因为player_0和player_1使用关联你必须更新关联,而不是与关联配对的外国id(我认为这与ActiveModel :: Dirty牵引一些恶作剧但我不确定)。因此,请将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