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 级别捕获异常,所以对我们来说效果很好。