Rails 5 个依赖::destroy 不起作用
Rails 5 dependent: :destroy doesn't work
我有以下 类:
class Product < ApplicationRecord
belongs_to :product_category
def destroy
puts "Product Destroy!"
end
end
class ProductCategory < ApplicationRecord
has_many :products, dependent: :destroy
def destroy
puts "Category Destroy!"
end
end
在这里,我试图重写 destroy 方法,我最终想这样做:
update_attribute(:deleted_at, Time.now)
当我 运行 在 Rails 控制台中执行以下语句时: ProductCategory.destroy_all
我得到以下输出
Category Destroy!
Category Destroy!
Category Destroy!
注意:我有三个分类,每个分类有不止一种产品。我可以通过 ProductCategory.find(1).products
确认它,其中 returns 一系列产品。我听说 Rails 中的实现发生了变化。5. 关于如何让它工作有什么要点吗?
编辑
我最终想要的是,一次软删除一个类别和所有关联的产品。这可能吗?或者将在销毁回调之前迭代每个 Product 对象? (我的最后一个选项)
你应该从你的 destroy 方法调用 super:
def destroy
super
puts "Category destroy"
end
但我绝对不会建议您覆盖活动模型方法。
所以我最终是这样做的:
class Product < ApplicationRecord
belongs_to :product_category
def destroy
run_callbacks :destroy do
update_attribute(:deleted_at, Time.now)
# return true to escape exception being raised for rollback
true
end
end
end
class ProductCategory < ApplicationRecord
has_many :products, dependent: :destroy
def destroy
# run all callback around the destory method
run_callbacks :destroy do
update_attribute(:deleted_at, Time.now)
# return true to escape exception being raised for rollback
true
end
end
end
我从销毁中返回 true 确实让 update_attribute 有点危险,但我也在 ApplicationController 级别捕获异常,所以对我们来说效果很好。
我有以下 类:
class Product < ApplicationRecord
belongs_to :product_category
def destroy
puts "Product Destroy!"
end
end
class ProductCategory < ApplicationRecord
has_many :products, dependent: :destroy
def destroy
puts "Category Destroy!"
end
end
在这里,我试图重写 destroy 方法,我最终想这样做:
update_attribute(:deleted_at, Time.now)
当我 运行 在 Rails 控制台中执行以下语句时: ProductCategory.destroy_all
我得到以下输出
Category Destroy!
Category Destroy!
Category Destroy!
注意:我有三个分类,每个分类有不止一种产品。我可以通过 ProductCategory.find(1).products
确认它,其中 returns 一系列产品。我听说 Rails 中的实现发生了变化。5. 关于如何让它工作有什么要点吗?
编辑
我最终想要的是,一次软删除一个类别和所有关联的产品。这可能吗?或者将在销毁回调之前迭代每个 Product 对象? (我的最后一个选项)
你应该从你的 destroy 方法调用 super:
def destroy
super
puts "Category destroy"
end
但我绝对不会建议您覆盖活动模型方法。
所以我最终是这样做的:
class Product < ApplicationRecord
belongs_to :product_category
def destroy
run_callbacks :destroy do
update_attribute(:deleted_at, Time.now)
# return true to escape exception being raised for rollback
true
end
end
end
class ProductCategory < ApplicationRecord
has_many :products, dependent: :destroy
def destroy
# run all callback around the destory method
run_callbacks :destroy do
update_attribute(:deleted_at, Time.now)
# return true to escape exception being raised for rollback
true
end
end
end
我从销毁中返回 true 确实让 update_attribute 有点危险,但我也在 ApplicationController 级别捕获异常,所以对我们来说效果很好。