首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果:has_many现在为空,则在更新/销毁:belongs_to时移除:has_many

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

Stack Overflow用户
提问于 2009-10-09 20:10:16
回答 1查看 276关注 0票数 0

我有些州有很多城市(belongs_to :state),他们有很多企业(belongs_to :city)。状态也是…has_many :企业,:通过=> :cities

在我的网站上,一切都是从业务的角度进行管理的。当创建/更新新业务时,如果州/城市不存在,则会创建它。这发生在:before_save调用中。

当业务更新时,我在删除州/市时遇到问题。如果企业所在的州/市发生了变化(同样是在编辑业务表单时发生的),而旧的州/市不再有任何企业,我想要销毁它。我曾尝试在after_save调用中这样做,但它们被包装在一个事务中,即使我将变量分配给旧州/市的名称,它们似乎在事务期间的某个时候被更改为新的州/市。这太疯狂了!我使用"puts“调用在我的业务模型中打印某些点的var,并观察var在保存过程中的变化。这很令人沮丧。

所以,现在我在控制器上处理这件事,但感觉有点不对劲。

下面是我的一些代码。

http://pastie.org/648832

此外,我也很乐意就如何更好地组织整个事情提供任何意见。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-10-09 20:37:25

如果一个关系没有任何方面,你想要after_destroy回调来销毁它的多个方面。

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

代码语言:javascript
复制
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在销毁后是如何处理关联的。我假设,如果它们是急切加载的,那么上面的代码将不会工作,您将需要备用检查。否则它应该是好的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1545820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档