Module: ActsAsOrderedTree::Adapters::PostgreSQLAdapter

Defined in:
lib/acts_as_ordered_tree/adapters/postgresql_adapter.rb

Defined Under Namespace

Modules: Rails30UpdateAllPatch

Instance Method Summary collapse

Instance Method Details

#ancestorsObject

Recursive ancestors fetcher



25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/acts_as_ordered_tree/adapters/postgresql_adapter.rb', line 25

def ancestors
  query = "    SELECT id, \#{parent_column}, 1 AS _depth\n    FROM \#{self.class.quoted_table_name}\n    WHERE \#{arel[:id].eq(parent.try(:id)).to_sql}\n    UNION ALL\n    SELECT alias1.id, alias1.\#{parent_column}, _depth + 1\n    FROM \#{self.class.quoted_table_name} alias1\n      INNER JOIN ancestors ON alias1.id = ancestors.\#{parent_column}\n  QUERY\n\n  with_recursive_join(query, 'ancestors').order('ancestors._depth DESC')\nend\n"

#descendantsObject



58
59
60
# File 'lib/acts_as_ordered_tree/adapters/postgresql_adapter.rb', line 58

def descendants
  self_and_descendants.where(arel[:id].not_eq(id))
end

#rootObject



39
40
41
# File 'lib/acts_as_ordered_tree/adapters/postgresql_adapter.rb', line 39

def root
  root? ? self : ancestors.first
end

#self_and_ancestorsObject

Recursive ancestors fetcher



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/acts_as_ordered_tree/adapters/postgresql_adapter.rb', line 5

def self_and_ancestors
  if persisted? && !send("#{parent_column}_changed?")
    query = "      SELECT id, \#{parent_column}, 1 AS _depth\n      FROM \#{self.class.quoted_table_name}\n      WHERE \#{arel[:id].eq(id).to_sql}\n      UNION ALL\n      SELECT alias1.id, alias1.\#{parent_column}, _depth + 1\n      FROM \#{self.class.quoted_table_name} alias1\n        INNER JOIN self_and_ancestors ON alias1.id = self_and_ancestors.\#{parent_column}\n    QUERY\n\n    with_recursive_join(query, 'self_and_ancestors').\n        order('self_and_ancestors._depth DESC')\n  else\n    ancestors + [self]\n  end\nend\n"

#self_and_descendantsObject



43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/acts_as_ordered_tree/adapters/postgresql_adapter.rb', line 43

def self_and_descendants
  query = "    SELECT id, \#{parent_column}, ARRAY[\#{position_column}] AS _positions\n    FROM \#{self.class.quoted_table_name}\n    WHERE \#{arel[:id].eq(id).to_sql}\n    UNION ALL\n    SELECT alias1.id, alias1.\#{parent_column}, _positions || alias1.\#{position_column}\n    FROM descendants INNER JOIN\n      \#{self.class.quoted_table_name} alias1 ON alias1.parent_id = descendants.id\n  QUERY\n\n  with_recursive_join(query, 'descendants').\n      order('descendants._positions ASC')\nend\n"