polyamorous 1.3.3 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/polyamorous.rb +13 -40
- data/lib/polyamorous/activerecord_5.1_ruby_2/join_association.rb +1 -9
- data/lib/polyamorous/activerecord_5.1_ruby_2/join_dependency.rb +2 -20
- data/lib/polyamorous/{activerecord_5.2_ruby_2 → activerecord_5.2.0_ruby_2}/join_association.rb +2 -10
- data/lib/polyamorous/{activerecord_5.2_ruby_2 → activerecord_5.2.0_ruby_2}/join_dependency.rb +3 -21
- data/lib/polyamorous/activerecord_5.2.0_ruby_2/reflection.rb +12 -0
- data/lib/polyamorous/activerecord_5.2.1_ruby_2/join_association.rb +22 -0
- data/lib/polyamorous/activerecord_5.2.1_ruby_2/join_dependency.rb +81 -0
- data/lib/polyamorous/activerecord_5.2.1_ruby_2/reflection.rb +2 -0
- data/lib/polyamorous/activerecord_6.0_ruby_2/join_association.rb +2 -0
- data/lib/polyamorous/activerecord_6.0_ruby_2/join_dependency.rb +81 -0
- data/lib/polyamorous/activerecord_6.0_ruby_2/reflection.rb +2 -0
- data/lib/polyamorous/activerecord_6.1_ruby_2/join_association.rb +2 -0
- data/lib/polyamorous/activerecord_6.1_ruby_2/join_dependency.rb +2 -0
- data/lib/polyamorous/activerecord_6.1_ruby_2/reflection.rb +2 -0
- data/lib/polyamorous/version.rb +1 -1
- data/polyamorous.gemspec +2 -4
- metadata +19 -49
- data/.gitignore +0 -6
- data/.travis.yml +0 -59
- data/Gemfile +0 -33
- data/LICENSE +0 -20
- data/README.md +0 -21
- data/Rakefile +0 -17
- data/lib/polyamorous/activerecord_3_and_4.0_ruby_1.9/join_association.rb +0 -76
- data/lib/polyamorous/activerecord_3_and_4.0_ruby_1.9/join_dependency.rb +0 -96
- data/lib/polyamorous/activerecord_4.1_ruby_1.9/join_association.rb +0 -2
- data/lib/polyamorous/activerecord_4.1_ruby_1.9/join_dependency.rb +0 -4
- data/lib/polyamorous/activerecord_4.1_ruby_2/join_association.rb +0 -2
- data/lib/polyamorous/activerecord_4.1_ruby_2/join_dependency.rb +0 -3
- data/lib/polyamorous/activerecord_4.1_ruby_2/make_polyamorous_inner_joins.rb +0 -14
- data/lib/polyamorous/activerecord_4.2_ruby_1.9/join_association.rb +0 -46
- data/lib/polyamorous/activerecord_4.2_ruby_1.9/join_dependency.rb +0 -87
- data/lib/polyamorous/activerecord_4.2_ruby_2/join_association.rb +0 -2
- data/lib/polyamorous/activerecord_4.2_ruby_2/join_dependency.rb +0 -24
- data/spec/blueprints/articles.rb +0 -5
- data/spec/blueprints/comments.rb +0 -5
- data/spec/blueprints/notes.rb +0 -3
- data/spec/blueprints/people.rb +0 -4
- data/spec/blueprints/tags.rb +0 -3
- data/spec/helpers/polyamorous_helper.rb +0 -26
- data/spec/polyamorous/join_association_spec.rb +0 -54
- data/spec/polyamorous/join_dependency_spec.rb +0 -102
- data/spec/polyamorous/join_spec.rb +0 -19
- data/spec/spec_helper.rb +0 -43
- data/spec/support/schema.rb +0 -98
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e492b2c26e7349c7319dcbeef6873fc5a86e2a8c6eb8e9fa7d0a9a7797f3bf1d
|
4
|
+
data.tar.gz: 46334d1ae1c9223ee8bb100785a91e0601faaf653b7c43ae7be1c6740731974b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4046a135237cd578403749be629af46ecec8e14841f930dc0524dbec9906219ec8d45e681e402a0fe874c632f03babca710f7f993db7afdfd85ad5f2882b2bf6
|
7
|
+
data.tar.gz: 1f6bb027ca8d1c1b2e90586c05b59282f0355422b550f33436b98deb1738fd7c5a17370560f087f7f4cd6e85d4faebcc7221375886f89b29d7936364722c3859
|
data/lib/polyamorous.rb
CHANGED
@@ -1,24 +1,10 @@
|
|
1
|
-
require 'polyamorous/version'
|
2
|
-
|
3
1
|
if defined?(::ActiveRecord)
|
4
2
|
module Polyamorous
|
5
|
-
|
6
|
-
|
7
|
-
OuterJoin = Arel::OuterJoin
|
8
|
-
else
|
9
|
-
InnerJoin = Arel::Nodes::InnerJoin
|
10
|
-
OuterJoin = Arel::Nodes::OuterJoin
|
11
|
-
end
|
3
|
+
InnerJoin = Arel::Nodes::InnerJoin
|
4
|
+
OuterJoin = Arel::Nodes::OuterJoin
|
12
5
|
|
13
|
-
|
14
|
-
|
15
|
-
JoinAssociation = ::ActiveRecord::Associations::JoinDependency::JoinAssociation
|
16
|
-
JoinBase = ::ActiveRecord::Associations::JoinDependency::JoinBase
|
17
|
-
else
|
18
|
-
JoinDependency = ::ActiveRecord::Associations::ClassMethods::JoinDependency
|
19
|
-
JoinAssociation = ::ActiveRecord::Associations::ClassMethods::JoinDependency::JoinAssociation
|
20
|
-
JoinBase = ::ActiveRecord::Associations::ClassMethods::JoinDependency::JoinBase
|
21
|
-
end
|
6
|
+
JoinDependency = ::ActiveRecord::Associations::JoinDependency
|
7
|
+
JoinAssociation = ::ActiveRecord::Associations::JoinDependency::JoinAssociation
|
22
8
|
end
|
23
9
|
|
24
10
|
require 'polyamorous/tree_node'
|
@@ -26,31 +12,18 @@ if defined?(::ActiveRecord)
|
|
26
12
|
require 'polyamorous/swapping_reflection_class'
|
27
13
|
|
28
14
|
ar_version = ::ActiveRecord::VERSION::STRING[0,3]
|
29
|
-
ar_version =
|
30
|
-
|
31
|
-
method, ruby_version =
|
32
|
-
if RUBY_VERSION >= '2.0' && ar_version >= '4.1'
|
33
|
-
# Ruby 2; we can use `prepend` to patch Active Record cleanly.
|
34
|
-
[:prepend, '2']
|
35
|
-
else
|
36
|
-
# Ruby 1.9; we must use `alias_method` to patch Active Record.
|
37
|
-
[:include, '1.9']
|
38
|
-
end
|
39
|
-
|
15
|
+
ar_version = ::ActiveRecord::VERSION::STRING[0,5] if ar_version >= "5.2" && ::ActiveRecord.version < ::Gem::Version.new("6.0")
|
16
|
+
ar_version = "5.2.1" if ::ActiveRecord::VERSION::STRING >= "5.2.1" && ::ActiveRecord.version < ::Gem::Version.new("6.0")
|
40
17
|
%w(join_association join_dependency).each do |file|
|
41
|
-
require "polyamorous/activerecord_#{ar_version}
|
18
|
+
require "polyamorous/activerecord_#{ar_version}_ruby_2/#{file}"
|
42
19
|
end
|
43
20
|
|
44
|
-
|
45
|
-
|
46
|
-
Polyamorous::
|
47
|
-
.send(:prepend, Polyamorous::JoinDependencyExtensions::ClassMethods)
|
21
|
+
if ar_version >= "5.2.0"
|
22
|
+
require "polyamorous/activerecord_#{ar_version}_ruby_2/reflection.rb"
|
23
|
+
::ActiveRecord::Reflection::AbstractReflection.send(:prepend, Polyamorous::ReflectionExtensions)
|
48
24
|
end
|
49
|
-
Polyamorous::JoinAssociation.send(method, Polyamorous::JoinAssociationExtensions)
|
50
25
|
|
51
|
-
Polyamorous::
|
52
|
-
|
53
|
-
|
54
|
-
end
|
55
|
-
end
|
26
|
+
Polyamorous::JoinDependency.send(:prepend, Polyamorous::JoinDependencyExtensions)
|
27
|
+
Polyamorous::JoinDependency.singleton_class.send(:prepend, Polyamorous::JoinDependencyExtensions::ClassMethods)
|
28
|
+
Polyamorous::JoinAssociation.send(:prepend, Polyamorous::JoinAssociationExtensions)
|
56
29
|
end
|
@@ -7,8 +7,7 @@ module Polyamorous
|
|
7
7
|
base.class_eval { attr_reader :join_type }
|
8
8
|
end
|
9
9
|
|
10
|
-
def initialize(reflection, children, polymorphic_class = nil,
|
11
|
-
join_type = Arel::Nodes::InnerJoin)
|
10
|
+
def initialize(reflection, children, polymorphic_class = nil, join_type = Arel::Nodes::InnerJoin)
|
12
11
|
@join_type = join_type
|
13
12
|
if polymorphic_class && ::ActiveRecord::Base > polymorphic_class
|
14
13
|
swapping_reflection_klass(reflection, polymorphic_class) do |reflection|
|
@@ -20,13 +19,6 @@ module Polyamorous
|
|
20
19
|
end
|
21
20
|
end
|
22
21
|
|
23
|
-
# Reference: https://github.com/rails/rails/commit/9b15db5
|
24
|
-
# NOTE: Not sure we still need it?
|
25
|
-
#
|
26
|
-
def ==(other)
|
27
|
-
base_klass == other.base_klass
|
28
|
-
end
|
29
|
-
|
30
22
|
def build_constraint(klass, table, key, foreign_table, foreign_key)
|
31
23
|
if reflection.polymorphic?
|
32
24
|
super(klass, table, key, foreign_table, foreign_key)
|
@@ -9,7 +9,7 @@ module Polyamorous
|
|
9
9
|
if name.is_a? Join
|
10
10
|
reflection = find_reflection base_klass, name.name
|
11
11
|
reflection.check_validity!
|
12
|
-
reflection.check_eager_loadable!
|
12
|
+
reflection.check_eager_loadable!
|
13
13
|
|
14
14
|
klass = if reflection.polymorphic?
|
15
15
|
name.klass || base_klass
|
@@ -20,7 +20,7 @@ module Polyamorous
|
|
20
20
|
else
|
21
21
|
reflection = find_reflection base_klass, name
|
22
22
|
reflection.check_validity!
|
23
|
-
reflection.check_eager_loadable!
|
23
|
+
reflection.check_eager_loadable!
|
24
24
|
|
25
25
|
if reflection.polymorphic?
|
26
26
|
raise ActiveRecord::EagerLoadPolymorphicError.new(reflection)
|
@@ -30,24 +30,6 @@ module Polyamorous
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
def find_join_association_respecting_polymorphism(reflection, parent, klass)
|
34
|
-
if association = parent.children.find { |j| j.reflection == reflection }
|
35
|
-
unless reflection.polymorphic?
|
36
|
-
association
|
37
|
-
else
|
38
|
-
association if association.base_klass == klass
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def build_join_association_respecting_polymorphism(reflection, parent, klass)
|
44
|
-
if reflection.polymorphic? && klass
|
45
|
-
JoinAssociation.new(reflection, self, klass)
|
46
|
-
else
|
47
|
-
JoinAssociation.new(reflection, self)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
33
|
# Replaces ActiveRecord::Associations::JoinDependency#join_constraints
|
52
34
|
#
|
53
35
|
# This internal method was changed in Rails 5.0 by commit
|
data/lib/polyamorous/{activerecord_5.2_ruby_2 → activerecord_5.2.0_ruby_2}/join_association.rb
RENAMED
@@ -7,8 +7,7 @@ module Polyamorous
|
|
7
7
|
base.class_eval { attr_reader :join_type }
|
8
8
|
end
|
9
9
|
|
10
|
-
def initialize(reflection, children, alias_tracker, polymorphic_class = nil,
|
11
|
-
join_type = Arel::Nodes::InnerJoin)
|
10
|
+
def initialize(reflection, children, alias_tracker, polymorphic_class = nil, join_type = Arel::Nodes::InnerJoin)
|
12
11
|
@join_type = join_type
|
13
12
|
if polymorphic_class && ::ActiveRecord::Base > polymorphic_class
|
14
13
|
swapping_reflection_klass(reflection, polymorphic_class) do |reflection|
|
@@ -20,17 +19,10 @@ module Polyamorous
|
|
20
19
|
end
|
21
20
|
end
|
22
21
|
|
23
|
-
# Reference: https://github.com/rails/rails/commit/9b15db5
|
24
|
-
# NOTE: Not sure we still need it?
|
25
|
-
#
|
26
|
-
def ==(other)
|
27
|
-
base_klass == other.base_klass
|
28
|
-
end
|
29
|
-
|
30
22
|
def build_constraint(klass, table, key, foreign_table, foreign_key)
|
31
23
|
if reflection.polymorphic?
|
32
24
|
super(klass, table, key, foreign_table, foreign_key)
|
33
|
-
|
25
|
+
.and(foreign_table[reflection.foreign_type].eq(reflection.klass.name))
|
34
26
|
else
|
35
27
|
super(klass, table, key, foreign_table, foreign_key)
|
36
28
|
end
|
data/lib/polyamorous/{activerecord_5.2_ruby_2 → activerecord_5.2.0_ruby_2}/join_dependency.rb
RENAMED
@@ -9,7 +9,7 @@ module Polyamorous
|
|
9
9
|
if name.is_a? Join
|
10
10
|
reflection = find_reflection base_klass, name.name
|
11
11
|
reflection.check_validity!
|
12
|
-
reflection.check_eager_loadable!
|
12
|
+
reflection.check_eager_loadable!
|
13
13
|
|
14
14
|
klass = if reflection.polymorphic?
|
15
15
|
name.klass || base_klass
|
@@ -20,7 +20,7 @@ module Polyamorous
|
|
20
20
|
else
|
21
21
|
reflection = find_reflection base_klass, name
|
22
22
|
reflection.check_validity!
|
23
|
-
reflection.check_eager_loadable!
|
23
|
+
reflection.check_eager_loadable!
|
24
24
|
|
25
25
|
if reflection.polymorphic?
|
26
26
|
raise ActiveRecord::EagerLoadPolymorphicError.new(reflection)
|
@@ -30,24 +30,6 @@ module Polyamorous
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
def find_join_association_respecting_polymorphism(reflection, parent, klass)
|
34
|
-
if association = parent.children.find { |j| j.reflection == reflection }
|
35
|
-
unless reflection.polymorphic?
|
36
|
-
association
|
37
|
-
else
|
38
|
-
association if association.base_klass == klass
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def build_join_association_respecting_polymorphism(reflection, parent, klass)
|
44
|
-
if reflection.polymorphic? && klass
|
45
|
-
JoinAssociation.new(reflection, self, alias_tracker, klass)
|
46
|
-
else
|
47
|
-
JoinAssociation.new(reflection, self, alias_tracker)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
33
|
# Replaces ActiveRecord::Associations::JoinDependency#join_constraints
|
52
34
|
#
|
53
35
|
# This internal method was changed in Rails 5.0 by commit
|
@@ -65,7 +47,7 @@ module Polyamorous
|
|
65
47
|
}
|
66
48
|
|
67
49
|
joins.concat outer_joins.flat_map { |oj|
|
68
|
-
if join_root.match? oj.join_root
|
50
|
+
if join_root.match?(oj.join_root) && join_root.table.name == oj.join_root.table.name
|
69
51
|
walk(join_root, oj.join_root)
|
70
52
|
else
|
71
53
|
oj.join_root.children.flat_map { |child|
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Polyamorous
|
2
|
+
module ReflectionExtensions
|
3
|
+
def build_join_constraint(table, foreign_table)
|
4
|
+
if polymorphic?
|
5
|
+
super(table, foreign_table)
|
6
|
+
.and(foreign_table[foreign_type].eq(klass.name))
|
7
|
+
else
|
8
|
+
super(table, foreign_table)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# active_record_5.2.1_ruby_2/join_association.rb
|
2
|
+
|
3
|
+
module Polyamorous
|
4
|
+
module JoinAssociationExtensions
|
5
|
+
include SwappingReflectionClass
|
6
|
+
def self.prepended(base)
|
7
|
+
base.class_eval { attr_reader :join_type }
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(reflection, children, polymorphic_class = nil, join_type = Arel::Nodes::InnerJoin)
|
11
|
+
@join_type = join_type
|
12
|
+
if polymorphic_class && ::ActiveRecord::Base > polymorphic_class
|
13
|
+
swapping_reflection_klass(reflection, polymorphic_class) do |reflection|
|
14
|
+
super(reflection, children)
|
15
|
+
self.reflection.options[:polymorphic] = true
|
16
|
+
end
|
17
|
+
else
|
18
|
+
super(reflection, children)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# active_record_5.2.1_ruby_2/join_dependency.rb
|
2
|
+
|
3
|
+
module Polyamorous
|
4
|
+
module JoinDependencyExtensions
|
5
|
+
# Replaces ActiveRecord::Associations::JoinDependency#build
|
6
|
+
def build(associations, base_klass)
|
7
|
+
associations.map do |name, right|
|
8
|
+
if name.is_a? Join
|
9
|
+
reflection = find_reflection base_klass, name.name
|
10
|
+
reflection.check_validity!
|
11
|
+
reflection.check_eager_loadable!
|
12
|
+
|
13
|
+
klass = if reflection.polymorphic?
|
14
|
+
name.klass || base_klass
|
15
|
+
else
|
16
|
+
reflection.klass
|
17
|
+
end
|
18
|
+
JoinAssociation.new(reflection, build(right, klass), name.klass, name.type)
|
19
|
+
else
|
20
|
+
reflection = find_reflection base_klass, name
|
21
|
+
reflection.check_validity!
|
22
|
+
reflection.check_eager_loadable!
|
23
|
+
|
24
|
+
if reflection.polymorphic?
|
25
|
+
raise ActiveRecord::EagerLoadPolymorphicError.new(reflection)
|
26
|
+
end
|
27
|
+
JoinAssociation.new(reflection, build(right, reflection.klass))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def join_constraints(joins_to_add, join_type, alias_tracker)
|
33
|
+
@alias_tracker = alias_tracker
|
34
|
+
|
35
|
+
construct_tables!(join_root)
|
36
|
+
joins = make_join_constraints(join_root, join_type)
|
37
|
+
|
38
|
+
joins.concat joins_to_add.flat_map { |oj|
|
39
|
+
construct_tables!(oj.join_root)
|
40
|
+
if join_root.match?(oj.join_root) && join_root.table.name == oj.join_root.table.name
|
41
|
+
walk join_root, oj.join_root
|
42
|
+
else
|
43
|
+
make_join_constraints(oj.join_root, join_type)
|
44
|
+
end
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def make_constraints(parent, child, join_type = Arel::Nodes::OuterJoin)
|
50
|
+
foreign_table = parent.table
|
51
|
+
foreign_klass = parent.base_klass
|
52
|
+
join_type = child.join_type || join_type if join_type == Arel::Nodes::InnerJoin
|
53
|
+
joins = child.join_constraints(foreign_table, foreign_klass, join_type, alias_tracker)
|
54
|
+
joins.concat child.children.flat_map { |c| make_constraints(child, c, join_type) }
|
55
|
+
end
|
56
|
+
|
57
|
+
module ClassMethods
|
58
|
+
# Prepended before ActiveRecord::Associations::JoinDependency#walk_tree
|
59
|
+
#
|
60
|
+
def walk_tree(associations, hash)
|
61
|
+
case associations
|
62
|
+
when TreeNode
|
63
|
+
associations.add_to_tree(hash)
|
64
|
+
when Hash
|
65
|
+
associations.each do |k, v|
|
66
|
+
cache =
|
67
|
+
if TreeNode === k
|
68
|
+
k.add_to_tree(hash)
|
69
|
+
else
|
70
|
+
hash[k] ||= {}
|
71
|
+
end
|
72
|
+
walk_tree(v, cache)
|
73
|
+
end
|
74
|
+
else
|
75
|
+
super(associations, hash)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# active_record_6.0_ruby_2/join_dependency.rb
|
2
|
+
|
3
|
+
module Polyamorous
|
4
|
+
module JoinDependencyExtensions
|
5
|
+
# Replaces ActiveRecord::Associations::JoinDependency#build
|
6
|
+
def build(associations, base_klass)
|
7
|
+
associations.map do |name, right|
|
8
|
+
if name.is_a? Join
|
9
|
+
reflection = find_reflection base_klass, name.name
|
10
|
+
reflection.check_validity!
|
11
|
+
reflection.check_eager_loadable!
|
12
|
+
|
13
|
+
klass = if reflection.polymorphic?
|
14
|
+
name.klass || base_klass
|
15
|
+
else
|
16
|
+
reflection.klass
|
17
|
+
end
|
18
|
+
JoinAssociation.new(reflection, build(right, klass), name.klass, name.type)
|
19
|
+
else
|
20
|
+
reflection = find_reflection base_klass, name
|
21
|
+
reflection.check_validity!
|
22
|
+
reflection.check_eager_loadable!
|
23
|
+
|
24
|
+
if reflection.polymorphic?
|
25
|
+
raise ActiveRecord::EagerLoadPolymorphicError.new(reflection)
|
26
|
+
end
|
27
|
+
JoinAssociation.new(reflection, build(right, reflection.klass))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def join_constraints(joins_to_add, alias_tracker)
|
33
|
+
@alias_tracker = alias_tracker
|
34
|
+
|
35
|
+
construct_tables!(join_root)
|
36
|
+
joins = make_join_constraints(join_root, join_type)
|
37
|
+
|
38
|
+
joins.concat joins_to_add.flat_map { |oj|
|
39
|
+
construct_tables!(oj.join_root)
|
40
|
+
if join_root.match?(oj.join_root) && join_root.table.name == oj.join_root.table.name
|
41
|
+
walk join_root, oj.join_root, oj.join_type
|
42
|
+
else
|
43
|
+
make_join_constraints(oj.join_root, oj.join_type)
|
44
|
+
end
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def make_constraints(parent, child, join_type = Arel::Nodes::OuterJoin)
|
50
|
+
foreign_table = parent.table
|
51
|
+
foreign_klass = parent.base_klass
|
52
|
+
join_type = child.join_type || join_type if join_type == Arel::Nodes::InnerJoin
|
53
|
+
joins = child.join_constraints(foreign_table, foreign_klass, join_type, alias_tracker)
|
54
|
+
joins.concat child.children.flat_map { |c| make_constraints(child, c, join_type) }
|
55
|
+
end
|
56
|
+
|
57
|
+
module ClassMethods
|
58
|
+
# Prepended before ActiveRecord::Associations::JoinDependency#walk_tree
|
59
|
+
#
|
60
|
+
def walk_tree(associations, hash)
|
61
|
+
case associations
|
62
|
+
when TreeNode
|
63
|
+
associations.add_to_tree(hash)
|
64
|
+
when Hash
|
65
|
+
associations.each do |k, v|
|
66
|
+
cache =
|
67
|
+
if TreeNode === k
|
68
|
+
k.add_to_tree(hash)
|
69
|
+
else
|
70
|
+
hash[k] ||= {}
|
71
|
+
end
|
72
|
+
walk_tree(v, cache)
|
73
|
+
end
|
74
|
+
else
|
75
|
+
super(associations, hash)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|