2012-04-30 138 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只得到触发“当你添加一个对象或删除关联集合的对象”。如果您希望在删除团队后更新玩家属性,我建议您改用Team类中的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

嗯..当我这样做时,当试图摧毁一个团队时,我得到错误'参数的错误数量(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编写的触发器。如果你的数据存储支持它。

否则你自己的解决方案看起来不错。