Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2006-09-16

[Rails][プラポケ]カードの position がおかしくなるバグ

前々からたまにカードのpositionが一貫性のない数値になることがあって、ソートが正しく行えなくなる等のバグがおこることがあったのだが、その再現方法がわかった。対戦後に2枚以上の連続するカードが同時に消えると確実にその現象が起こることを確認。

class Card < ActiveRecord::Base
  acts_as_list :scope => :player_id
end

acts_as_list を使っている。

カードの削除は以下のようにしていた。高速化を意識してややトリッキー。

DefCard.find(:all).each do |def_card|
  con = "def_card_id = #{def_card.id} AND #{def_card.life} + life_plus <= 0"
  Card.destroy_all(con)
end

一枚ずつ消せばいいかと思い、以下のように修正したがダメだった。

Player.find(:all).each do |player|
  player.cards.each do |card|
    next if card.life > 0
    card.destroy
  end
end

以下のように reload したら正常に動いた。いつも ActiveRecord の reload ではまる……。

Player.find(:all).each do |player|
  player.cards.each do |card|
    next if card.life > 0
    card.reload
    card.destroy
  end
end