polyamorous 1.3.3 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|