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