Spree::Classification.class_eval do
  belongs_to :product, :class_name => "Spree::Product", touch: true
  after_save :refresh_products_cache
  before_destroy :dont_destroy_if_primary_taxon
  after_destroy :refresh_products_cache


  private

  def refresh_products_cache
    product.refresh_products_cache
  end

  def dont_destroy_if_primary_taxon
    if product.primary_taxon == taxon
      errors.add :base,  I18n.t(:spree_classification_primary_taxon_error, taxon: taxon.name, product: product.name)
      return false
    end
  end
end

Spree::Classification.class_eval do
  belongs_to :product, class_name: "Spree::Product", touch: true

  before_destroy :dont_destroy_if_primary_taxon
  after_destroy :refresh_products_cache
  after_save :refresh_products_cache

  private

  def refresh_products_cache
    Spree::Product.with_deleted.find(product_id).refresh_products_cache
  end

  def dont_destroy_if_primary_taxon
    if product.primary_taxon == taxon
      errors.add :base,  I18n.t(:spree_classification_primary_taxon_error, taxon: taxon.name, product: product.name)
      return false
    end
  end
end

Handle soft deleted products when refreshing cache
Handle soft deleted products when refreshing cache

Since cd3add960e Spree soft-deletes products and as such the models not
destroyed but updated setting a value for the `deleted_at` field.

This turns what used to be deletes into updates thus triggering AR's
update callbacks instead of the destroy ones. As a result, this bypasses
the logic to refresh the products cache on destroy and hits the
`after_save` callback.

Furthermore, since act_as_paranoid (the soft-delete gem Spree uses) uses
a default scope to avoid retrieving soft-deleted records we need to
purposefully fetch them in order to refresh the cache.
