-1

プレーヤー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
4

1 に答える 1

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
于 2013-02-19T03:08:30.007 に答える