edge_rider 1.0.0 → 1.1.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/.ruby-version +1 -1
- data/.travis.yml +30 -42
- data/CHANGELOG.md +6 -0
- data/Gemfile.3.2.mysql2 +2 -1
- data/Gemfile.3.2.mysql2.lock +14 -4
- data/Gemfile.4.2.mysql2 +1 -0
- data/Gemfile.4.2.mysql2.lock +13 -3
- data/Gemfile.4.2.pg +1 -0
- data/Gemfile.4.2.pg.lock +13 -3
- data/Gemfile.5.2.mysql2 +1 -0
- data/Gemfile.5.2.mysql2.lock +13 -3
- data/Gemfile.5.2.pg +1 -0
- data/Gemfile.5.2.pg.lock +13 -3
- data/Gemfile.6.0.pg +1 -0
- data/Gemfile.6.0.pg.lock +13 -3
- data/README.md +3 -1
- data/edge_rider.gemspec +2 -1
- data/lib/edge_rider/preload_associations.rb +7 -0
- data/lib/edge_rider/traverse_association.rb +7 -3
- data/lib/edge_rider/version.rb +1 -1
- data/spec/edge_rider/preload_associations_spec.rb +24 -8
- data/spec/edge_rider/traverse_association_spec.rb +47 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/support/database.rb +5 -0
- data/spec/support/models.rb +9 -0
- metadata +6 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 9c9ae54cb1c626a978a21ae71fb21049cbc411bc41f0f5b2651b0ad021fce5d8
|
|
4
|
+
data.tar.gz: 8d6ac8d94078882641a29e7cf3e6ad3ef72d2e09b6af036ceba87fea9ee67c5f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 58093961cabe247323cccccb9b119fb572b63a6e0d977a5b93774b4dbfeeaf8da30d2bbed48682171db6a99c9ba6f41caf4cfa5969255eabdb1078da8cea3d33
|
|
7
|
+
data.tar.gz: e68386960e037f56bb54605c63a1d8f3beffca8c7348016a9d650a62a65e7568879fb89c4953a2fd65d6c131a9d9c6d61e4707dde2c719be07486bc3add50877
|
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.
|
|
1
|
+
2.5.3
|
data/.travis.yml
CHANGED
|
@@ -1,45 +1,37 @@
|
|
|
1
1
|
language: ruby
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
- '2.2.4'
|
|
5
|
-
- '2.3.1'
|
|
6
|
-
- '2.4.1'
|
|
7
|
-
- '2.5.3'
|
|
8
|
-
|
|
9
|
-
gemfile:
|
|
10
|
-
- 'Gemfile.3.2.mysql2'
|
|
11
|
-
- 'Gemfile.4.2.mysql2'
|
|
12
|
-
- 'Gemfile.4.2.pg'
|
|
13
|
-
- 'Gemfile.5.2.mysql2'
|
|
14
|
-
- 'Gemfile.5.2.pg'
|
|
15
|
-
- 'Gemfile.6.0.pg'
|
|
3
|
+
dist: trusty
|
|
16
4
|
|
|
17
5
|
matrix:
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
-
|
|
42
|
-
|
|
6
|
+
include:
|
|
7
|
+
- rvm: 2.2.4
|
|
8
|
+
gemfile: Gemfile.3.2.mysql2
|
|
9
|
+
- rvm: 2.2.4
|
|
10
|
+
gemfile: Gemfile.4.2.mysql2
|
|
11
|
+
- rvm: 2.3.1
|
|
12
|
+
gemfile: Gemfile.4.2.mysql2
|
|
13
|
+
- rvm: 2.2.4
|
|
14
|
+
gemfile: Gemfile.4.2.pg
|
|
15
|
+
- rvm: 2.3.1
|
|
16
|
+
gemfile: Gemfile.4.2.pg
|
|
17
|
+
- rvm: 2.2.4
|
|
18
|
+
gemfile: Gemfile.5.2.mysql2
|
|
19
|
+
- rvm: 2.3.1
|
|
20
|
+
gemfile: Gemfile.5.2.mysql2
|
|
21
|
+
- rvm: 2.4.1
|
|
22
|
+
gemfile: Gemfile.5.2.mysql2
|
|
23
|
+
- rvm: 2.5.3
|
|
24
|
+
gemfile: Gemfile.5.2.mysql2
|
|
25
|
+
- rvm: 2.2.4
|
|
26
|
+
gemfile: Gemfile.5.2.pg
|
|
27
|
+
- rvm: 2.3.1
|
|
28
|
+
gemfile: Gemfile.5.2.pg
|
|
29
|
+
- rvm: 2.4.1
|
|
30
|
+
gemfile: Gemfile.5.2.pg
|
|
31
|
+
- rvm: 2.5.3
|
|
32
|
+
gemfile: Gemfile.5.2.pg
|
|
33
|
+
- rvm: 2.5.3
|
|
34
|
+
gemfile: Gemfile.6.0.pg
|
|
43
35
|
|
|
44
36
|
services:
|
|
45
37
|
- mysql
|
|
@@ -57,7 +49,3 @@ before_script:
|
|
|
57
49
|
- mysql -e 'create database IF NOT EXISTS edge_rider_test;'
|
|
58
50
|
|
|
59
51
|
script: bundle exec rake current_rspec
|
|
60
|
-
|
|
61
|
-
notifications:
|
|
62
|
-
email:
|
|
63
|
-
- fail@makandra.de
|
data/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,12 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
|
|
|
11
11
|
### Compatible changes
|
|
12
12
|
-
|
|
13
13
|
|
|
14
|
+
## 1.1.0
|
|
15
|
+
|
|
16
|
+
### Compatible changes
|
|
17
|
+
- Add `preload_association` at instance level. Example: `user.preload_associations(:posts)`
|
|
18
|
+
- Add support for polymorphic associations in `traverse_association`.
|
|
19
|
+
|
|
14
20
|
## 1.0.0
|
|
15
21
|
|
|
16
22
|
### Breaking changes
|
data/Gemfile.3.2.mysql2
CHANGED
data/Gemfile.3.2.mysql2.lock
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
edge_rider (
|
|
5
|
-
activerecord
|
|
4
|
+
edge_rider (1.1.0)
|
|
5
|
+
activerecord (>= 3.2)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
@@ -20,14 +20,23 @@ GEM
|
|
|
20
20
|
multi_json (~> 1.0)
|
|
21
21
|
arel (3.0.3)
|
|
22
22
|
builder (3.0.4)
|
|
23
|
+
byebug (10.0.2)
|
|
24
|
+
coderay (1.1.2)
|
|
23
25
|
database_cleaner (1.0.1)
|
|
24
26
|
diff-lcs (1.2.5)
|
|
25
|
-
gemika (0.
|
|
27
|
+
gemika (0.4.0)
|
|
26
28
|
has_defaults (0.4.4)
|
|
27
29
|
activerecord
|
|
28
30
|
i18n (0.6.11)
|
|
31
|
+
method_source (0.9.2)
|
|
29
32
|
multi_json (1.12.1)
|
|
30
33
|
mysql2 (0.3.17)
|
|
34
|
+
pry (0.12.2)
|
|
35
|
+
coderay (~> 1.1.0)
|
|
36
|
+
method_source (~> 0.9.0)
|
|
37
|
+
pry-byebug (3.6.0)
|
|
38
|
+
byebug (~> 10.0)
|
|
39
|
+
pry (~> 0.10)
|
|
31
40
|
rake (10.0.4)
|
|
32
41
|
rspec (3.5.0)
|
|
33
42
|
rspec-core (~> 3.5.0)
|
|
@@ -51,10 +60,11 @@ DEPENDENCIES
|
|
|
51
60
|
activerecord (= 3.2.22)
|
|
52
61
|
database_cleaner
|
|
53
62
|
edge_rider!
|
|
54
|
-
gemika
|
|
63
|
+
gemika
|
|
55
64
|
has_defaults
|
|
56
65
|
i18n (= 0.6.11)
|
|
57
66
|
mysql2 (= 0.3.17)
|
|
67
|
+
pry-byebug
|
|
58
68
|
rake (= 10.0.4)
|
|
59
69
|
rspec (~> 3.4)
|
|
60
70
|
|
data/Gemfile.4.2.mysql2
CHANGED
data/Gemfile.4.2.mysql2.lock
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
edge_rider (
|
|
5
|
-
activerecord
|
|
4
|
+
edge_rider (1.1.0)
|
|
5
|
+
activerecord (>= 3.2)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
@@ -22,15 +22,24 @@ GEM
|
|
|
22
22
|
tzinfo (~> 1.1)
|
|
23
23
|
arel (6.0.3)
|
|
24
24
|
builder (3.2.2)
|
|
25
|
+
byebug (10.0.2)
|
|
26
|
+
coderay (1.1.2)
|
|
25
27
|
database_cleaner (1.0.1)
|
|
26
28
|
diff-lcs (1.2.5)
|
|
27
|
-
gemika (0.
|
|
29
|
+
gemika (0.4.0)
|
|
28
30
|
has_defaults (0.4.4)
|
|
29
31
|
activerecord
|
|
30
32
|
i18n (0.7.0)
|
|
31
33
|
json (1.8.3)
|
|
34
|
+
method_source (0.9.2)
|
|
32
35
|
minitest (5.9.1)
|
|
33
36
|
mysql2 (0.3.21)
|
|
37
|
+
pry (0.12.2)
|
|
38
|
+
coderay (~> 1.1.0)
|
|
39
|
+
method_source (~> 0.9.0)
|
|
40
|
+
pry-byebug (3.6.0)
|
|
41
|
+
byebug (~> 10.0)
|
|
42
|
+
pry (~> 0.10)
|
|
34
43
|
rake (11.3.0)
|
|
35
44
|
rspec (3.5.0)
|
|
36
45
|
rspec-core (~> 3.5.0)
|
|
@@ -59,6 +68,7 @@ DEPENDENCIES
|
|
|
59
68
|
gemika
|
|
60
69
|
has_defaults
|
|
61
70
|
mysql2 (~> 0.3.17)
|
|
71
|
+
pry-byebug
|
|
62
72
|
rake
|
|
63
73
|
rspec
|
|
64
74
|
|
data/Gemfile.4.2.pg
CHANGED
data/Gemfile.4.2.pg.lock
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
edge_rider (
|
|
5
|
-
activerecord
|
|
4
|
+
edge_rider (1.1.0)
|
|
5
|
+
activerecord (>= 3.2)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
@@ -22,15 +22,24 @@ GEM
|
|
|
22
22
|
tzinfo (~> 1.1)
|
|
23
23
|
arel (6.0.3)
|
|
24
24
|
builder (3.2.2)
|
|
25
|
+
byebug (10.0.2)
|
|
26
|
+
coderay (1.1.2)
|
|
25
27
|
database_cleaner (1.5.3)
|
|
26
28
|
diff-lcs (1.2.5)
|
|
27
|
-
gemika (0.
|
|
29
|
+
gemika (0.4.0)
|
|
28
30
|
has_defaults (0.4.4)
|
|
29
31
|
activerecord
|
|
30
32
|
i18n (0.7.0)
|
|
31
33
|
json (1.8.3)
|
|
34
|
+
method_source (0.9.2)
|
|
32
35
|
minitest (5.9.1)
|
|
33
36
|
pg (0.19.0)
|
|
37
|
+
pry (0.12.2)
|
|
38
|
+
coderay (~> 1.1.0)
|
|
39
|
+
method_source (~> 0.9.0)
|
|
40
|
+
pry-byebug (3.6.0)
|
|
41
|
+
byebug (~> 10.0)
|
|
42
|
+
pry (~> 0.10)
|
|
34
43
|
rake (11.3.0)
|
|
35
44
|
rspec (3.5.0)
|
|
36
45
|
rspec-core (~> 3.5.0)
|
|
@@ -59,6 +68,7 @@ DEPENDENCIES
|
|
|
59
68
|
gemika
|
|
60
69
|
has_defaults
|
|
61
70
|
pg
|
|
71
|
+
pry-byebug
|
|
62
72
|
rake
|
|
63
73
|
rspec
|
|
64
74
|
|
data/Gemfile.5.2.mysql2
CHANGED
data/Gemfile.5.2.mysql2.lock
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
edge_rider (
|
|
5
|
-
activerecord
|
|
4
|
+
edge_rider (1.1.0)
|
|
5
|
+
activerecord (>= 3.2)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
@@ -19,16 +19,25 @@ GEM
|
|
|
19
19
|
minitest (~> 5.1)
|
|
20
20
|
tzinfo (~> 1.1)
|
|
21
21
|
arel (9.0.0)
|
|
22
|
+
byebug (10.0.2)
|
|
23
|
+
coderay (1.1.2)
|
|
22
24
|
concurrent-ruby (1.1.5)
|
|
23
25
|
database_cleaner (1.6.1)
|
|
24
26
|
diff-lcs (1.3)
|
|
25
|
-
gemika (0.
|
|
27
|
+
gemika (0.4.0)
|
|
26
28
|
has_defaults (0.4.4)
|
|
27
29
|
activerecord
|
|
28
30
|
i18n (1.5.1)
|
|
29
31
|
concurrent-ruby (~> 1.0)
|
|
32
|
+
method_source (0.9.2)
|
|
30
33
|
minitest (5.11.3)
|
|
31
34
|
mysql2 (0.4.6)
|
|
35
|
+
pry (0.12.2)
|
|
36
|
+
coderay (~> 1.1.0)
|
|
37
|
+
method_source (~> 0.9.0)
|
|
38
|
+
pry-byebug (3.6.0)
|
|
39
|
+
byebug (~> 10.0)
|
|
40
|
+
pry (~> 0.10)
|
|
32
41
|
rake (12.0.0)
|
|
33
42
|
rspec (3.6.0)
|
|
34
43
|
rspec-core (~> 3.6.0)
|
|
@@ -58,6 +67,7 @@ DEPENDENCIES
|
|
|
58
67
|
has_defaults
|
|
59
68
|
i18n (<= 1.5.1)
|
|
60
69
|
mysql2
|
|
70
|
+
pry-byebug
|
|
61
71
|
rake
|
|
62
72
|
rspec
|
|
63
73
|
|
data/Gemfile.5.2.pg
CHANGED
data/Gemfile.5.2.pg.lock
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
edge_rider (
|
|
5
|
-
activerecord
|
|
4
|
+
edge_rider (1.1.0)
|
|
5
|
+
activerecord (>= 3.2)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
@@ -19,16 +19,25 @@ GEM
|
|
|
19
19
|
minitest (~> 5.1)
|
|
20
20
|
tzinfo (~> 1.1)
|
|
21
21
|
arel (9.0.0)
|
|
22
|
+
byebug (10.0.2)
|
|
23
|
+
coderay (1.1.2)
|
|
22
24
|
concurrent-ruby (1.1.5)
|
|
23
25
|
database_cleaner (1.6.1)
|
|
24
26
|
diff-lcs (1.3)
|
|
25
|
-
gemika (0.
|
|
27
|
+
gemika (0.4.0)
|
|
26
28
|
has_defaults (0.4.4)
|
|
27
29
|
activerecord
|
|
28
30
|
i18n (1.5.1)
|
|
29
31
|
concurrent-ruby (~> 1.0)
|
|
32
|
+
method_source (0.9.2)
|
|
30
33
|
minitest (5.11.3)
|
|
31
34
|
pg (0.20.0)
|
|
35
|
+
pry (0.12.2)
|
|
36
|
+
coderay (~> 1.1.0)
|
|
37
|
+
method_source (~> 0.9.0)
|
|
38
|
+
pry-byebug (3.6.0)
|
|
39
|
+
byebug (~> 10.0)
|
|
40
|
+
pry (~> 0.10)
|
|
32
41
|
rake (12.0.0)
|
|
33
42
|
rspec (3.6.0)
|
|
34
43
|
rspec-core (~> 3.6.0)
|
|
@@ -58,6 +67,7 @@ DEPENDENCIES
|
|
|
58
67
|
has_defaults
|
|
59
68
|
i18n (<= 1.5.1)
|
|
60
69
|
pg
|
|
70
|
+
pry-byebug
|
|
61
71
|
rake
|
|
62
72
|
rspec
|
|
63
73
|
|
data/Gemfile.6.0.pg
CHANGED
data/Gemfile.6.0.pg.lock
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
edge_rider (
|
|
5
|
-
activerecord
|
|
4
|
+
edge_rider (1.1.0)
|
|
5
|
+
activerecord (>= 3.2)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
@@ -18,16 +18,25 @@ GEM
|
|
|
18
18
|
minitest (~> 5.1)
|
|
19
19
|
tzinfo (~> 1.1)
|
|
20
20
|
zeitwerk (~> 2.1, >= 2.1.4)
|
|
21
|
+
byebug (10.0.2)
|
|
22
|
+
coderay (1.1.2)
|
|
21
23
|
concurrent-ruby (1.1.5)
|
|
22
24
|
database_cleaner (1.7.0)
|
|
23
25
|
diff-lcs (1.3)
|
|
24
|
-
gemika (0.
|
|
26
|
+
gemika (0.4.0)
|
|
25
27
|
has_defaults (0.4.4)
|
|
26
28
|
activerecord
|
|
27
29
|
i18n (1.6.0)
|
|
28
30
|
concurrent-ruby (~> 1.0)
|
|
31
|
+
method_source (0.9.2)
|
|
29
32
|
minitest (5.11.3)
|
|
30
33
|
pg (1.1.4)
|
|
34
|
+
pry (0.12.2)
|
|
35
|
+
coderay (~> 1.1.0)
|
|
36
|
+
method_source (~> 0.9.0)
|
|
37
|
+
pry-byebug (3.6.0)
|
|
38
|
+
byebug (~> 10.0)
|
|
39
|
+
pry (~> 0.10)
|
|
31
40
|
rake (12.3.2)
|
|
32
41
|
rspec (3.8.0)
|
|
33
42
|
rspec-core (~> 3.8.0)
|
|
@@ -57,6 +66,7 @@ DEPENDENCIES
|
|
|
57
66
|
gemika
|
|
58
67
|
has_defaults
|
|
59
68
|
pg
|
|
69
|
+
pry-byebug
|
|
60
70
|
rake
|
|
61
71
|
rspec
|
|
62
72
|
|
data/README.md
CHANGED
|
@@ -151,10 +151,12 @@ It now uses these IDs to return a new relation that has **no joins** and a singl
|
|
|
151
151
|
|
|
152
152
|
Sometimes you want to fetch associations for records that you already instantiated, e.g. when it has deeply nested associations.
|
|
153
153
|
|
|
154
|
-
Edge Rider gives your model classes a method
|
|
154
|
+
Edge Rider gives your model classes and instances a method `preload_associations`. The method can be used to preload associations for loaded objects like this:
|
|
155
155
|
|
|
156
156
|
@user = User.find(params[:id])
|
|
157
157
|
User.preload_associations [@user], { threads: { posts: :author }, messages: :sender }
|
|
158
|
+
# or
|
|
159
|
+
user.preload_associations { threads: { posts: :author }, messages: :sender }
|
|
158
160
|
|
|
159
161
|
*Implementation note*: Rails 3.0 already has a method [`.preload_associations`](https://apidock.com/rails/ActiveRecord/AssociationPreload/ClassMethods/preload_associations)
|
|
160
162
|
which Edge Rider merely makes public. Edge Rider ports this method forward to Rails 3.1+.
|
data/edge_rider.gemspec
CHANGED
|
@@ -16,5 +16,6 @@ Gem::Specification.new do |s|
|
|
|
16
16
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
17
17
|
s.require_paths = ["lib"]
|
|
18
18
|
|
|
19
|
-
s.add_dependency('activerecord')
|
|
19
|
+
s.add_dependency('activerecord', '>=3.2')
|
|
20
|
+
s.required_ruby_version = ">= 2.2"
|
|
20
21
|
end
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
module EdgeRider
|
|
2
2
|
module PreloadAssociations
|
|
3
|
+
module PreloadAssociationsInstanceMethod
|
|
4
|
+
def preload_associations(*args)
|
|
5
|
+
self.class.preload_associations([self], *args)
|
|
6
|
+
end
|
|
7
|
+
end
|
|
3
8
|
|
|
4
9
|
def preload_associations(*args)
|
|
5
10
|
preloader = ActiveRecord::Associations::Preloader
|
|
@@ -21,5 +26,7 @@ module EdgeRider
|
|
|
21
26
|
ActiveRecord::Base.send(:extend, self)
|
|
22
27
|
end
|
|
23
28
|
|
|
29
|
+
ActiveRecord::Base.send(:include, PreloadAssociationsInstanceMethod)
|
|
30
|
+
|
|
24
31
|
end
|
|
25
32
|
end
|
|
@@ -8,7 +8,7 @@ module EdgeRider
|
|
|
8
8
|
|
|
9
9
|
scope = scoped({})
|
|
10
10
|
|
|
11
|
-
associations.
|
|
11
|
+
associations.each do |association|
|
|
12
12
|
|
|
13
13
|
reflection = scope.reflect_on_association(association) or raise UnknownAssociation, "Could not find association: #{self.name}##{association}"
|
|
14
14
|
foreign_key = reflection.respond_to?(:foreign_key) ? reflection.foreign_key : reflection.primary_key_name
|
|
@@ -24,8 +24,12 @@ module EdgeRider
|
|
|
24
24
|
if reflection.through_reflection # has_many :through
|
|
25
25
|
scope = scope.traverse_association(reflection.through_reflection.name, reflection.source_reflection.name)
|
|
26
26
|
else # has_many or has_one
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
conditions = {}
|
|
28
|
+
# A polymorphic association has a type attribute, e.g. record_type, that needs to be added to condition.
|
|
29
|
+
conditions[reflection.type] = self.name if reflection.type.present?
|
|
30
|
+
conditions[foreign_key] = scope.collect_ids
|
|
31
|
+
|
|
32
|
+
scope = EdgeRider::Util.exclusive_query(reflection.klass, conditions)
|
|
29
33
|
end
|
|
30
34
|
else
|
|
31
35
|
raise UnsupportedAssociation, "Unsupport association type: #{reflection.macro}"
|
data/lib/edge_rider/version.rb
CHANGED
|
@@ -2,14 +2,30 @@ require 'spec_helper'
|
|
|
2
2
|
|
|
3
3
|
describe EdgeRider::PreloadAssociations do
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
describe '.preload_associations' do
|
|
6
|
+
it 'should preload the given named associations so they are no longer fetched lazily' do
|
|
7
|
+
forum = Forum.create!
|
|
8
|
+
topic = Topic.create!(forum: forum)
|
|
9
|
+
post = Post.create!(topic: topic)
|
|
10
|
+
|
|
11
|
+
Forum.preload_associations([forum], topics: :posts)
|
|
12
|
+
Topic.should_not_receive(:new)
|
|
13
|
+
Post.should_not_receive(:new)
|
|
14
|
+
forum.topics.collect(&:posts)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe '#preload_associations' do
|
|
19
|
+
it 'should preload the given named associations so they are no longer fetched lazily' do
|
|
20
|
+
forum = Forum.create!
|
|
21
|
+
topic = Topic.create!(forum: forum)
|
|
22
|
+
post = Post.create!(topic: topic)
|
|
23
|
+
|
|
24
|
+
forum.preload_associations(topics: :posts)
|
|
25
|
+
Topic.should_not_receive(:new)
|
|
26
|
+
Post.should_not_receive(:new)
|
|
27
|
+
forum.topics.collect(&:posts)
|
|
28
|
+
end
|
|
13
29
|
end
|
|
14
30
|
|
|
15
31
|
end
|
|
@@ -123,6 +123,53 @@ describe EdgeRider::TraverseAssociation do
|
|
|
123
123
|
traversed_scope.to_a.should =~ [post_3a, post_3b]
|
|
124
124
|
end
|
|
125
125
|
|
|
126
|
+
it 'should traverse to a polymorphic has one association' do
|
|
127
|
+
profile = Profile.create!
|
|
128
|
+
profile_attachment = Attachment.create!(record: profile)
|
|
129
|
+
|
|
130
|
+
# Sanity check that the condition includes both record id and record type
|
|
131
|
+
Attachment.create!(record_id: profile_attachment.id, record_type: 'NonExisting')
|
|
132
|
+
|
|
133
|
+
scope = Profile.scoped(conditions: { id: [profile.id] })
|
|
134
|
+
scope.traverse_association(:attachment).to_a.should =~ [profile_attachment]
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
it 'should traverse to a polymorphic has many association' do
|
|
138
|
+
topic = Topic.create!
|
|
139
|
+
topic_attachment_1 = Attachment.create!(record: topic)
|
|
140
|
+
topic_attachment_2 = Attachment.create!(record: topic)
|
|
141
|
+
|
|
142
|
+
# Sanity check that the condition includes both record id and record type
|
|
143
|
+
Attachment.create!(record_id: topic_attachment_1.id, record_type: 'NonExisting')
|
|
144
|
+
|
|
145
|
+
scope = Topic.scoped(conditions: { id: [topic_attachment_1.id, topic_attachment_2.id] })
|
|
146
|
+
scope.traverse_association(:attachments).to_a.should =~ [topic_attachment_1, topic_attachment_2]
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
it 'should raise an error if you want to traverse from a polymorphic association' do
|
|
150
|
+
profile = Profile.create!
|
|
151
|
+
profile_attachment = Attachment.create!(record: profile)
|
|
152
|
+
|
|
153
|
+
scope = Attachment.scoped(conditions: { id: [profile_attachment.id] })
|
|
154
|
+
|
|
155
|
+
if [4, 3].include?(EdgeRider::Util.active_record_version)
|
|
156
|
+
expect { scope.traverse_association(:record) }.to raise_error(
|
|
157
|
+
NameError,
|
|
158
|
+
'uninitialized constant Attachment::Record'
|
|
159
|
+
)
|
|
160
|
+
elsif EdgeRider::Util.active_record_version == 5
|
|
161
|
+
expect { scope.traverse_association(:record) }.to raise_error(
|
|
162
|
+
ArgumentError,
|
|
163
|
+
'Polymorphic association does not support to compute class.'
|
|
164
|
+
)
|
|
165
|
+
else
|
|
166
|
+
expect { scope.traverse_association(:record) }.to raise_error(
|
|
167
|
+
ArgumentError,
|
|
168
|
+
'Polymorphic associations do not support computing the class.'
|
|
169
|
+
)
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
126
173
|
end
|
|
127
174
|
|
|
128
175
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -4,6 +4,8 @@ require 'edge_rider'
|
|
|
4
4
|
require 'edge_rider/development'
|
|
5
5
|
require 'database_cleaner'
|
|
6
6
|
require 'gemika'
|
|
7
|
+
require 'pry'
|
|
8
|
+
require 'byebug'
|
|
7
9
|
|
|
8
10
|
# Requires supporting files with custom matchers and macros, etc in ./support/ and its subdirectories.
|
|
9
11
|
Dir["#{File.dirname(__FILE__)}/support/*.rb"].sort.each {|f| require f}
|
data/spec/support/database.rb
CHANGED
data/spec/support/models.rb
CHANGED
|
@@ -51,6 +51,7 @@ class Profile < ActiveRecord::Base
|
|
|
51
51
|
include AllowSettingIdOnCreate
|
|
52
52
|
|
|
53
53
|
belongs_to :user
|
|
54
|
+
has_one :attachment, as: :record
|
|
54
55
|
|
|
55
56
|
has_defaults trashed: false
|
|
56
57
|
|
|
@@ -67,6 +68,7 @@ class Topic < ActiveRecord::Base
|
|
|
67
68
|
has_many :posts
|
|
68
69
|
belongs_to :author, class_name: 'User'
|
|
69
70
|
has_many :post_authors, through: :posts
|
|
71
|
+
has_many :attachments, as: :record
|
|
70
72
|
|
|
71
73
|
has_defaults trashed: false
|
|
72
74
|
|
|
@@ -86,3 +88,10 @@ class User < ActiveRecord::Base
|
|
|
86
88
|
has_defaults trashed: false
|
|
87
89
|
|
|
88
90
|
end
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class Attachment < ActiveRecord::Base
|
|
94
|
+
|
|
95
|
+
belongs_to :record, polymorphic: true
|
|
96
|
+
|
|
97
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: edge_rider
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Henning Koch
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-
|
|
11
|
+
date: 2019-12-13 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activerecord
|
|
@@ -16,14 +16,14 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
19
|
+
version: '3.2'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - ">="
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
26
|
+
version: '3.2'
|
|
27
27
|
description: Power tools for ActiveRecord relations (scopes)
|
|
28
28
|
email: henning.koch@makandra.de
|
|
29
29
|
executables: []
|
|
@@ -86,15 +86,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
86
86
|
requirements:
|
|
87
87
|
- - ">="
|
|
88
88
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: '
|
|
89
|
+
version: '2.2'
|
|
90
90
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
91
91
|
requirements:
|
|
92
92
|
- - ">="
|
|
93
93
|
- !ruby/object:Gem::Version
|
|
94
94
|
version: '0'
|
|
95
95
|
requirements: []
|
|
96
|
-
|
|
97
|
-
rubygems_version: 2.4.5.1
|
|
96
|
+
rubygems_version: 3.0.6
|
|
98
97
|
signing_key:
|
|
99
98
|
specification_version: 4
|
|
100
99
|
summary: Power tools for ActiveRecord relations (scopes)
|