Class: ActsAsOrderedTree::Relation::Recursive

Inherits:
Base
  • Object
show all
Defined in:
lib/acts_as_ordered_tree/relation/recursive.rb

Overview

Recursive relation fixes Rails3.0 issue github.com/rails/rails/issues/522 for relations with joins to subqueries

Constant Summary

Constants inherited from Base

Base::EMPTY_SCOPE_METHOD

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#initialize

Constructor Details

This class inherits a constructor from ActsAsOrderedTree::Relation::Base

Instance Attribute Details

#recursive_query_valueObject

Returns the value of attribute recursive_query_value.



8
9
10
# File 'lib/acts_as_ordered_tree/relation/recursive.rb', line 8

def recursive_query_value
  @recursive_query_value
end

#recursive_table_valueObject

Returns the value of attribute recursive_table_value.



8
9
10
# File 'lib/acts_as_ordered_tree/relation/recursive.rb', line 8

def recursive_table_value
  @recursive_table_value
end

Instance Method Details

#build_arelObject



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/acts_as_ordered_tree/relation/recursive.rb', line 18

def build_arel
  if recursive_table_value && recursive_query_value
    join_sql = "INNER JOIN (" +
                 recursive_query_sql +
               ") AS #{recursive_table_value} ON #{recursive_table_value}.id = #{table.name}.id"

    except(:recursive_table, :recursive_query).joins(join_sql).build_arel
  else
    super
  end
end

#except(*skips) ⇒ Object



41
42
43
44
45
46
47
48
# File 'lib/acts_as_ordered_tree/relation/recursive.rb', line 41

def except(*skips)
  result = super
  ([:recursive_table, :recursive_query] - skips).each do |method|
    result.send("#{method}_value=", send(:"#{method}_value"))
  end

  result
end

#update_all(updates, conditions = nil, options = {}) ⇒ Object



30
31
32
33
34
35
36
37
38
39
# File 'lib/acts_as_ordered_tree/relation/recursive.rb', line 30

def update_all(updates, conditions = nil, options = {})
  if recursive_table_value && recursive_query_value
    scope = where("id IN (SELECT id FROM (#{recursive_query_sql}) AS #{recursive_table_value})").
        except(:recursive_table, :recursive_query, :limit, :order)

    scope.update_all(updates, conditions, options)
  else
    super
  end
end

#with_recursive(recursive_table_name, query) ⇒ Object

relation.with_recursive(“table_name”, “SELECT * FROM table_name”)



11
12
13
14
15
16
# File 'lib/acts_as_ordered_tree/relation/recursive.rb', line 11

def with_recursive(recursive_table_name, query)
  relation = clone
  relation.recursive_table_value = recursive_table_name
  relation.recursive_query_value = query
  relation
end