RoR在删除时更新子项的属性

时间:2012-04-30 17:49:10

标签: ruby-on-rails ruby

在我的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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我团队模型中的以下代码可以解决问题:

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



end

答案 2 :(得分:0)

“删除”和“破坏”之间存在区别。如果您实际使用“删除”,则不会运行任何回调。

因此,如果您希望代码以任何一种方式运行,那么最好的选择可能是用SQL编写的触发器。如果您的数据存储支持它。

否则你自己的解决方案看起来很好。