closure_tree icon indicating copy to clipboard operation
closure_tree copied to clipboard

Dirty tracking lost when setting parent with numeric_order option

Open ryanb opened this issue 3 years ago • 1 comments

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 avatar Jan 23 '23 22:01 ryanb

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

ryanb avatar Jan 24 '23 00:01 ryanb