module Xylem::InstanceMethods
Public Instance Methods
ancestors()
click to toggle source
# File lib/xylem.rb, line 5 def ancestors _xylem_query(:id, parent_id, :id, :parent_id, :desc) end
descendants()
click to toggle source
# File lib/xylem.rb, line 13 def descendants _xylem_query(:parent_id, id, :parent_id, :id, :asc) end
leaf?()
click to toggle source
# File lib/xylem.rb, line 41 def leaf? children.size == 0 end
leaves()
click to toggle source
# File lib/xylem.rb, line 45 def leaves descendants.leaves end
root()
click to toggle source
# File lib/xylem.rb, line 21 def root ancestors.first end
root?()
click to toggle source
# File lib/xylem.rb, line 37 def root? parent.nil? end
self_and_ancestors()
click to toggle source
# File lib/xylem.rb, line 9 def self_and_ancestors _xylem_query(:id, id, :id, :parent_id, :desc) end
self_and_children()
click to toggle source
# File lib/xylem.rb, line 33 def self_and_children [self] + children end
self_and_descendants()
click to toggle source
# File lib/xylem.rb, line 17 def self_and_descendants _xylem_query(:id, id, :parent_id, :id, :asc) end
self_and_siblings()
click to toggle source
# File lib/xylem.rb, line 29 def self_and_siblings self.class.where(parent_id: parent_id) end
siblings()
click to toggle source
# File lib/xylem.rb, line 25 def siblings self.class.where(parent_id: parent_id).where.not(id: id) end
Private Instance Methods
_xylem_query(where_col, where_val, join_lft_col, join_rgt_col, order_stmt)
click to toggle source
# File lib/xylem.rb, line 51 def _xylem_query(where_col, where_val, join_lft_col, join_rgt_col, order_stmt) rcte = Arel::Table.new(:recusive_cte) table = self.class.arel_table i_select = table.project([table[Arel.star], Arel::Nodes::As.new(1, Arel::Nodes::SqlLiteral.new('level'))]).where(table[where_col].eq(where_val)) r_select = table.project([table[Arel.star], Arel::Nodes::SqlLiteral.new('level + 1')]).join(rcte).on(table[join_lft_col].eq(rcte[join_rgt_col])) as_stmt = Arel::Nodes::As.new(rcte, i_select.union(:all, r_select)) self.class.from(Arel::Nodes::TableAlias.new(rcte.project(Arel.star).with(:recursive, as_stmt), self.class.table_name).to_sql).order(level: order_stmt) end