如果:has_many现在为空,则在更新/销毁:belongs_to时删除:has_many

时间:2009-10-09 20:10:16

标签: ruby-on-rails

我有许多城市(belongs_to:州)拥有许多企业(belongs_to:city)的州。 州也... has_many:商家,:通过=> :城市

在我的网站上,所有内容都是从业务角度进行管理的。创建/更新新业务时,如果状态/城市尚不存在,则创建该城市/城市。这发生在:before_save调用。

我在业务更新时删除州/引用时遇到问题。如果企业所在的州/城市发生变化(再次发生在编辑业务表格中),旧州/市不再有任何企业我想破坏它。我已尝试在after_save调用中执行此操作,但它们包含在事务中,即使我将变量分配给旧状态/城市的名称,它们似乎也会在事务期间的某个时间更改为新的状态/城市。这很疯狂!我使用“puts”调用在我的商业模式中的某些位置打印变量,并在保存期间观察变量。这令人沮丧。

所以,现在我正在从控制器处理这个问题,但感觉很乱。

这是我的一些代码。

http://pastie.org/648832

另外,我喜欢任何有关如何更好地构建整个事物的意见。

由于

1 个答案:

答案 0 :(得分:1)

如果没有关系,你想要after_destroy回调来破坏关系的多个方面。

要在更新后确保此行为,我们需要使用ActiveRecord :: Dirty方法。从2.1开始内置于rails中。如果您运行的是旧版本,则需要Dirty plugin

class Business < ActiveRecord::Base
  ...
  after_update :destroy_empty_city
  after_destroy :destroy_empty_city

  protected
    def destroy_empty_city
      c = city_changed? ? city_was : city
      c.destroy if c.businesses.empty?
    end


end

class City < ActiveRecord::Base
  ...
  after_destroy :destroy_empty_state

  protected
    def destroy_empty_state
      state.destroy if state.businesses.empty?
    end


end

如果您的关联被加载,您可能需要检查city/state.businesses == [self]而不是city/state.businesses.empty?。我不记得rails在破坏后如何​​处理关联。我假设,如果他们急于加载比上面的代码不起作用,你将需要备用检查。否则它应该没问题。