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 :company
在Company
中没有对应项。
后一个关联可能会被删除,并转换为has_many through
,因为仓库属于公司,产品属于仓库。
【讨论】:
【参考方案3】:您是否遵循 Rails 方式,以便您的 DB 中的 depots
表具有 company_id
字段等?
【讨论】:
是的,一切都已正确设置,我可以在嵌套属性中创建仓库和产品。这意味着关联工作正常。 根据可用信息,我无法弄清楚。你能提供你正在使用的确切代码吗? 例如,如果您使用的是accepts_nested_attributes_for,则可能是控制器问题以上是关于Rails 销毁所有嵌套关联的主要内容,如果未能解决你的问题,请参考以下文章