ClosureTree/closure_tree

Dirty tracking lost when setting parent with numeric_order option

ryanb opened this issue · 1 comments

ryanb commented

Say I have a model with numeric_order option:

class Category < ApplicationRecord
  has_closure_tree order: "position", numeric_order: true
end

With this setting we lose dirty tracking after setting the parent:

category.update! parent: parent_category, name: "Foo"
category.saved_change_to_name? # => false

All dirty tracking is lost since it ends up calling reload internally.

Perhaps this code could just reload the order attribute instead of the entire record? This way dirty tracking would persist.

ryanb commented

For the record, I'm currently monkey-patching to work around this issue. Feel free to use this in the implementation.

# in an initializer:
module ClosureTree
  module NumericDeterministicOrdering
    def _ct_reorder_siblings(minimum_sort_order_value = nil)
      _ct.reorder_with_parent_id(_ct_parent_id, minimum_sort_order_value)
      if !destroyed? && _ct.order_column
        self[_ct.order_column] = self.class
          .where(self.class.primary_key => id_in_database)
          .pick(_ct.order_column)
        clear_attribute_change(_ct.order_column)
      end
    end
  end
end