Class: RecursiveTreeScopes::Scopes

Inherits:
Object
  • Object
show all
Defined in:
lib/activerecord-recursive_tree_scopes.rb

Class Method Summary collapse

Class Method Details

.ancestors_for(instance, key) ⇒ Object



34
35
36
# File 'lib/activerecord-recursive_tree_scopes.rb', line 34

def ancestors_for(instance, key)
  instance.class.where("#{instance.class.table_name}.id IN (#{ancestors_sql_for instance, key})").order("#{instance.class.table_name}.id")
end

.ancestors_sql_for(instance, key) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/activerecord-recursive_tree_scopes.rb', line 38

def ancestors_sql_for(instance, key)
  tree_sql =  "    WITH RECURSIVE ancestor_search(id, \#{key}, path) AS (\n        SELECT id, \#{key}, ARRAY[id]\n          FROM \#{instance.class.table_name}\n          WHERE id = \#{instance.id}\n      UNION ALL\n        SELECT \#{instance.class.table_name}.id, \#{instance.class.table_name}.\#{key}, path || \#{instance.class.table_name}.id\n          FROM \#{instance.class.table_name}, ancestor_search\n          WHERE ancestor_search.\#{key} = \#{instance.class.table_name}.id\n      )\n    SELECT id\n      FROM ancestor_search\n      WHERE id != \#{instance.id}\n      ORDER BY path\n  SQL\n  tree_sql.gsub(/\\s{2,}/, ' ')\nend\n"

.descendants_for(instance, key) ⇒ Object



57
58
59
# File 'lib/activerecord-recursive_tree_scopes.rb', line 57

def descendants_for(instance, key)
  instance.class.where("#{instance.class.table_name}.id IN (#{descendants_sql_for instance, key})").order("#{instance.class.table_name}.id")
end

.descendants_sql_for(instance, key) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/activerecord-recursive_tree_scopes.rb', line 61

def descendants_sql_for(instance, key)
  tree_sql =  "    WITH RECURSIVE descendants_search(id, path) AS (\n        SELECT id, ARRAY[id]\n        FROM \#{instance.class.table_name}\n        WHERE id = \#{instance.id}\n      UNION ALL\n        SELECT \#{instance.class.table_name}.id, path || \#{instance.class.table_name}.id\n        FROM descendants_search\n        JOIN \#{instance.class.table_name} ON \#{instance.class.table_name}.\#{key} = descendants_search.id\n        WHERE NOT \#{instance.class.table_name}.id = ANY(path)\n    )\n    SELECT id\n      FROM descendants_search\n      WHERE id != \#{instance.id}\n      ORDER BY path\n  SQL\n  tree_sql.gsub(/\\s{2,}/, ' ')\nend\n"