我有许多城市(belongs_to:州)拥有许多企业(belongs_to:city)的州。 州也... has_many:商家,:通过=> :城市
在我的网站上,所有内容都是从业务角度进行管理的。创建/更新新业务时,如果状态/城市尚不存在,则创建该城市/城市。这发生在:before_save调用。
我在业务更新时删除州/引用时遇到问题。如果企业所在的州/城市发生变化(再次发生在编辑业务表格中),旧州/市不再有任何企业我想破坏它。我已尝试在after_save调用中执行此操作,但它们包含在事务中,即使我将变量分配给旧状态/城市的名称,它们似乎也会在事务期间的某个时间更改为新的状态/城市。这很疯狂!我使用“puts”调用在我的商业模式中的某些位置打印变量,并在保存期间观察变量。这令人沮丧。
所以,现在我正在从控制器处理这个问题,但感觉很乱。
这是我的一些代码。
另外,我喜欢任何有关如何更好地构建整个事物的意见。
由于
答案 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在破坏后如何处理关联。我假设,如果他们急于加载比上面的代码不起作用,你将需要备用检查。否则它应该没问题。