Rails 销毁所有嵌套关联

Posted

技术标签:

【中文标题】Rails 销毁所有嵌套关联【英文标题】:Rails Destroy All Nested Associations 【发布时间】:2016-05-03 16:01:34 【问题描述】:

我有以下场景

   class Company < ActiveRecord::Base
   
     has_many :depots, inverse_of: :company, :dependent => :destroy
     has_many :users, inverse_of: :company, :dependent => :destroy
     has_many :products
   
   end

   class Depot < ActiveRecord::Base
    
     has_many :products, :dependent => :destroy
     has_many :zones, :dependent => :destroy
     belongs_to :company
   
    end

   class Product < ActiveRecord::Base
     
       belongs_to :depot
       belongs_to :company

    end

    class Zone < ActiveRecord::Base
       belongs_to :depot
    end

    
    class User < ActiveRecord::Base
      belongs_to :company, , inverse_of: :users
    end
   
   ## and zone has_many locations which further has some associated models.

我想删除所有与公司关联的模型,而不是一一调用。 我的依赖销毁不起作用,当我尝试删除公司时,产品仍然存在。我试过替换

  dependent: :destroy #to delete_all 

但没有运气。如何通过一次对公司的 destroy 删除所有嵌套对象?

编辑

我可以打电话

 Company.reflect_on_all_associations(:has_many) 

并一一删除所有关联,但我不想采用这种方法。有什么帮助吗??

【问题讨论】:

请发布以下 mysql 查询的结果:“SHOW CREATE TABLE Companies” 抱歉,我使用 Postgres 作为我的数据库。 【参考方案1】:

我相信在你的模型中使用“inverse_of”子句是问题所在,因为它是 rails 文档中的最后一点。删除它们并尝试一下。如文档中所列:

inverse_of 支持有一些限制:

它们不适用于 :through 关联。 它们不适用于 :polymorphic 关联。 它们不适用于 :as 关联。 **对于belongs_to 关联,has_many 反向关联被忽略。

【讨论】:

没有任何区别。我都试过了,有和没有 inverse_of 都没有用。我必须使用它,因为我有一些需要在公司表格中预加载的关联。我不能使用 delete_all 因为它不会触发 depot 和产品的销毁。【参考方案2】:

不确定是什么不适用于您的设置,但如果您使 inverse_of 对称,它会起作用:

class Company < ActiveRecord::Base
  has_many :depots, inverse_of: :company, dependent: :destroy
  has_many :users, inverse_of: :company, dependent: :destroy
  has_many :products
end

class Depot < ActiveRecord::Base
  has_many :products, inverse_of: :depot, dependent: :destroy
  has_many :zones, inverse_of: :depot, dependent: :destroy
  belongs_to :company, inverse_of: :depots
end

class Product < ActiveRecord::Base
  belongs_to :depot, inverse_of: :products
  belongs_to :company
end

class Zone < ActiveRecord::Base
  belongs_to :depot, inverse_of: :zones
end


class User < ActiveRecord::Base
  belongs_to :company, inverse_of: :users
end

原答案

您可能想要修改类的关联方式。

在您的示例中,Depot 类缺少 belongs_to :company

Likewise Product 的belongs_to :companyCompany 中没有对应项。 后一个关联可能会被删除,并转换为has_many through,因为仓库属于公司,产品属于仓库。

【讨论】:

【参考方案3】:

您是否遵循 Rails 方式,以便您的 DB 中的 depots 表具有 company_id 字段等?

【讨论】:

是的,一切都已正确设置,我可以在嵌套属性中创建仓库和产品。这意味着关联工作正常。 根据可用信息,我无法弄清楚。你能提供你正在使用的确切代码吗? 例如,如果您使用的是accepts_nested_attributes_for,则可能是控制器问题

以上是关于Rails 销毁所有嵌套关联的主要内容,如果未能解决你的问题,请参考以下文章

如何在rails中销毁与登录用户相关的所有任务

销毁 Rails 中所有延迟的工作

Rails - 在before_destroy回调时取消销毁

如何清空/销毁 Rails 中的会话?

Rails 3:脚手架销毁动作重定向以显示动作

无法在 Rails 中使用 Devise 销毁会话 [重复]