我有些州有很多城市(belongs_to :state),他们有很多企业(belongs_to :city)。状态也是…has_many :企业,:通过=> :cities
在我的网站上,一切都是从业务的角度进行管理的。当创建/更新新业务时,如果州/城市不存在,则会创建它。这发生在:before_save调用中。
当业务更新时,我在删除州/市时遇到问题。如果企业所在的州/市发生了变化(同样是在编辑业务表单时发生的),而旧的州/市不再有任何企业,我想要销毁它。我曾尝试在after_save调用中这样做,但它们被包装在一个事务中,即使我将变量分配给旧州/市的名称,它们似乎在事务期间的某个时候被更改为新的州/市。这太疯狂了!我使用"puts“调用在我的业务模型中打印某些点的var,并观察var在保存过程中的变化。这很令人沮丧。
所以,现在我在控制器上处理这件事,但感觉有点不对劲。
下面是我的一些代码。
http://pastie.org/648832
此外,我也很乐意就如何更好地组织整个事情提供任何意见。
谢谢
发布于 2009-10-09 20:37:25
如果一个关系没有任何方面,你想要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在销毁后是如何处理关联的。我假设,如果它们是急切加载的,那么上面的代码将不会工作,您将需要备用检查。否则它应该是好的。
https://stackoverflow.com/questions/1545820
复制相似问题