Sha256: 80b91efa411e2d1c7c9758ab66ee89ab3566539dc5eee7335f01f04d7c355206

Contents?: true

Size: 1.69 KB

Versions: 10

Compression:

Stored size: 1.69 KB

Contents

module CollectiveIdea #:nodoc:
  module Acts #:nodoc:
    module NestedSet #:nodoc:
      class Tree
        attr_reader :model, :validate_nodes
        attr_accessor :indices

        delegate :left_column_name, :right_column_name, :quoted_parent_column_full_name,
                 :order_for_rebuild, :scope_for_rebuild,
                 :to => :model

        def initialize(model, validate_nodes)
          @model = model
          @validate_nodes = validate_nodes
          @indices = {}
        end

        def rebuild!
          # Don't rebuild a valid tree.
          return true if model.valid?

          root_nodes.each do |root_node|
            # setup index for this scope
            indices[scope_for_rebuild.call(root_node)] ||= 0
            set_left_and_rights(root_node)
          end
        end

        private

        def increment_indice!(node)
          indices[scope_for_rebuild.call(node)] += 1
        end

        def set_left_and_rights(node)
          set_left!(node)
          # find
          node_children(node).each { |n| set_left_and_rights(n) }
          set_right!(node)

          node.save!(:validate => validate_nodes)
        end

        def node_children(node)
          model.where(["#{quoted_parent_column_full_name} = ? #{scope_for_rebuild.call(node)}", node.primary_id]).
                order(order_for_rebuild)
        end

        def root_nodes
          model.where("#{quoted_parent_column_full_name} IS NULL").order(order_for_rebuild)
        end

        def set_left!(node)
          node[left_column_name] = increment_indice!(node)
        end

        def set_right!(node)
          node[right_column_name] = increment_indice!(node)
        end
      end
    end
  end
end

Version data entries

10 entries across 10 versions & 2 rubygems

Version Path
awesome_nested_set-3.0.3 lib/awesome_nested_set/tree.rb
solidus_backend-1.0.0.pre3 vendor/bundle/gems/awesome_nested_set-3.0.2/lib/awesome_nested_set/tree.rb
solidus_backend-1.0.0.pre2 vendor/bundle/gems/awesome_nested_set-3.0.2/lib/awesome_nested_set/tree.rb
solidus_backend-1.0.0.pre vendor/bundle/gems/awesome_nested_set-3.0.2/lib/awesome_nested_set/tree.rb
awesome_nested_set-3.0.2 lib/awesome_nested_set/tree.rb
awesome_nested_set-3.0.1 lib/awesome_nested_set/tree.rb
awesome_nested_set-3.0.0 lib/awesome_nested_set/tree.rb
awesome_nested_set-3.0.0.rc.6 lib/awesome_nested_set/tree.rb
awesome_nested_set-3.0.0.rc.5 lib/awesome_nested_set/tree.rb
awesome_nested_set-3.0.0.rc.4 lib/awesome_nested_set/tree.rb