0

私の RoR アプリでは、次の関係があります。チームには多くのプレーヤーがいて、プレーヤーはチームに属しています。

私がやりたいことは、team_idそのプレーヤーのチームが削除されたときに、プレーヤーの列の値を「10」(フリー エージェント) に変更することです。私のteamsモデルは次のようになりますが、機能していません

class Team < ActiveRecord::Base
  has_many :players, :after_remove => :make_free_agents  

  def make_free_agents(player)
    player.update_attribute(:team_id, "0")
  end
end
4

3 に答える 3

1

関連コールバックは、「関連コレクションにオブジェクトを追加するか、関連コレクションからオブジェクトを削除する場合」にのみトリガーされます。チームを削除した後にプレーヤーの属性を更新したい場合は、代わりに Team クラスのafter_destroyフックを使用することをお勧めします。

class Team < ActiveRecord::Base
  after_destroy :make_free_agents
  has_many :players

  def make_free_agents
    players.update_all(team_id: 0)
  end
end
于 2012-04-30T18:02:18.823 に答える
1

私のチームモデルの次のコードは、トリックを行いました:

class Team < ActiveRecord::Base
  before_destroy { |record| Player.update_all("team_id = '0'", "team_id = #{record.id}")   }
  has_many :players



end
于 2012-04-30T18:28:17.080 に答える
0

「削除」と「破棄」には違いがあります。実際に「削除」を使用している場合、コールバックは実行されません。

したがって、どちらの方法でもコードを実行したい場合は、おそらく SQL で記述されたトリガーが最適です。データ ストアがサポートしている場合。

それ以外の場合、独自のソリューションは問題ないように見えます。

于 2012-04-30T19:05:47.037 に答える