Method: StewEucen::Acts::FertileForest::Table::Reconstructers#prune

Defined in:
lib/fertile_forest/modules/reconstructers.rb

#prune(base_obj, with_top = false) ⇒ Boolean

Prune subtree nodes.

Parameters:

  • base_obj (Entity|Integer)

    Top node to prune.

  • with_top (Boolean) (defaults to: false)

    Include base node in return query.

Returns:

  • (Boolean)

    true: Success.

  • (Boolean)

    false: Failure.



573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
# File 'lib/fertile_forest/modules/reconstructers.rb', line 573

def prune(base_obj, with_top = false)
  transaction do
    aim_node = ff_resolve_nodes(base_obj, true)       # refresh
    raise ActiveRecord::Rollback if aim_node.blank?   # nil as dubious

    aim_queue = aim_node.ff_queue
    aim_depth = aim_node.ff_depth
    aim_grove = aim_node.ff_grove

    # boundry queue (can be nil)
    aim_boundary_queue = ff_get_boundary_queue(aim_node)

    # for soft delete
    # can not use subquery for same table in UPDATE
    # Mysql2::Error: You can't specify target table 'categories' for update in FROM clause:
    prune_query = ff_subtree_scope(aim_node, with_top, false)

    # soft delete
    if has_soft_delete?
      delete_key = @_ff_soft_delete
      res = prune_query.update_all("#{delete_key} = #{ff_options[:delete_value]}")
    elsif enable_grove_delete?
      grove_key = @_ff_grove
      res = prune_query.update_all("#{grove_key} = #{grove_key} * -1")
    else
      res = prune_query.delete_all
    end

    res
  end   # tansaction end
end