2012-04-30 5 views
0

私のRoRアプリケーションでは、私は以下の関係を持っています。チームには多くのプレーヤーがあり、プレーヤーはチームに属しています。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 

答えて

1

Association callbacks作業イマイチいるだけトリガーます。チームを削除した後にプレーヤーの属性を更新したい場合は、代わりにチームクラスのafter_destroy hookを使用することをおすすめします。

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

    def make_free_agents 
    players.update_all(team_id: 0) 
    end 
end 
+0

Hmm ..私がこれをすると、チームを破壊しようとすると「間違った引数(0のための1)」が返されます –

+0

私は間違ったビットを修正するために私の答えを編集しました。どうやら、after_destroyコールバックはレコードパラメータを取得しません(before_save/after_saveなどと違って) – Cade

+0

あなたはチームに関係なく、すべてのプレーヤーを更新することはありませんか?指定されたチームの選手だけを更新することはどこで知っていますか? –

1

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

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



end 
0

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

コードをいずれかの方法で実行したい場合は、おそらくSQLで書かれたトリガーでしょう。データストアがサポートしている場合

それ以外の場合は、独自の解決策が問題なく表示されます。