where_exists 1.0.1 → 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 +4 -4
- data/lib/where_exists.rb +22 -8
- data/lib/where_exists/version.rb +1 -1
- data/test/belongs_to_polymorphic_test.rb +2 -2
- data/test/belongs_to_test.rb +33 -2
- data/test/db/test.db +0 -0
- data/test/has_many_polymorphic_test.rb +2 -2
- data/test/has_many_test.rb +17 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b896dc7f4e36987c9fee2d3f99624944241c5778
|
4
|
+
data.tar.gz: 3b63cf040cc3eccc90b22ffb167815cbc6c26762
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f41ff3048e44820bd889403986a48ad90f95e1b3c97b0cfcd43a5797b2c5fdf706b8c6ac21ff3c9655489610a1ec38675001fd10ad5452237b0d46862f02660b
|
7
|
+
data.tar.gz: 744a933a1fcc1fc3bd5251fc1b686c3009d4b7894996a64bef294947d18ed283552b00a225213d3181ae9e8768f976fede2a26aec03c05e6910a35407c7d9003
|
data/lib/where_exists.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'active_record'
|
2
2
|
|
3
3
|
module WhereExists
|
4
|
-
def where_exists(association_name, where_parameters
|
4
|
+
def where_exists(association_name, *where_parameters)
|
5
5
|
where_exists_or_not_exists(true, association_name, where_parameters)
|
6
6
|
end
|
7
7
|
|
8
|
-
def where_not_exists(association_name, where_parameters
|
8
|
+
def where_not_exists(association_name, *where_parameters)
|
9
9
|
where_exists_or_not_exists(false, association_name, where_parameters)
|
10
10
|
end
|
11
11
|
|
@@ -33,8 +33,6 @@ module WhereExists
|
|
33
33
|
not_string = "NOT "
|
34
34
|
end
|
35
35
|
|
36
|
-
#queries.map!{|query| query.select(ActiveRecord::FinderMethods::ONE_AS_ONE).where(where_parameters)}
|
37
|
-
|
38
36
|
queries_sql = queries.map{|query| "EXISTS (" + query.to_sql + ")"}.join(" OR ")
|
39
37
|
|
40
38
|
self.where("#{not_string}(#{queries_sql})")
|
@@ -43,6 +41,8 @@ module WhereExists
|
|
43
41
|
def where_exists_for_belongs_to_query(association, where_parameters)
|
44
42
|
polymorphic = association.options[:polymorphic].present?
|
45
43
|
|
44
|
+
association_scope = association.scope
|
45
|
+
|
46
46
|
if polymorphic
|
47
47
|
associated_models = self.select("DISTINCT #{connection.quote_column_name(association.foreign_type)}").pluck(association.foreign_type).map(&:constantize)
|
48
48
|
else
|
@@ -57,7 +57,13 @@ module WhereExists
|
|
57
57
|
associated_models.each do |associated_model|
|
58
58
|
primary_key = association.options[:primary_key] || associated_model.primary_key
|
59
59
|
other_ids = quote_table_and_column_name(associated_model.table_name, primary_key)
|
60
|
-
query = associated_model.select("1").where("#{self_ids} = #{other_ids}")
|
60
|
+
query = associated_model.select("1").where("#{self_ids} = #{other_ids}")
|
61
|
+
if where_parameters != []
|
62
|
+
query = query.where(*where_parameters)
|
63
|
+
end
|
64
|
+
if association_scope
|
65
|
+
result = result.instance_exec(&association_scope)
|
66
|
+
end
|
61
67
|
if polymorphic
|
62
68
|
other_type = connection.quote(associated_model.name)
|
63
69
|
query = query.where("#{self_type} = #{other_type}")
|
@@ -71,6 +77,8 @@ module WhereExists
|
|
71
77
|
def where_exists_for_has_many_query(association, where_parameters)
|
72
78
|
through = association.options[:through].present?
|
73
79
|
|
80
|
+
association_scope = association.scope
|
81
|
+
|
74
82
|
if through
|
75
83
|
next_association = association.source_reflection
|
76
84
|
association = association.through_reflection
|
@@ -84,6 +92,10 @@ module WhereExists
|
|
84
92
|
|
85
93
|
result = associated_model.select("1").where("#{associated_ids} = #{self_ids}")
|
86
94
|
|
95
|
+
if association_scope
|
96
|
+
result = result.instance_exec(&association_scope)
|
97
|
+
end
|
98
|
+
|
87
99
|
if association.options[:as]
|
88
100
|
other_types = quote_table_and_column_name(associated_model.table_name, association.type)
|
89
101
|
self_class = connection.quote(self.name)
|
@@ -91,9 +103,11 @@ module WhereExists
|
|
91
103
|
end
|
92
104
|
|
93
105
|
if through
|
94
|
-
result = result.where_exists(next_association.name, where_parameters)
|
106
|
+
result = result.where_exists(next_association.name, *where_parameters)
|
95
107
|
else
|
96
|
-
|
108
|
+
if where_parameters != []
|
109
|
+
result = result.where(*where_parameters)
|
110
|
+
end
|
97
111
|
end
|
98
112
|
|
99
113
|
[result]
|
@@ -106,4 +120,4 @@ end
|
|
106
120
|
|
107
121
|
class ActiveRecord::Base
|
108
122
|
extend WhereExists
|
109
|
-
end
|
123
|
+
end
|
data/lib/where_exists/version.rb
CHANGED
@@ -19,11 +19,11 @@ class BelongsToPolymorphicChild < ActiveRecord::Base
|
|
19
19
|
end
|
20
20
|
|
21
21
|
class FirstPolymorphicEntity < ActiveRecord::Base
|
22
|
-
has_many :children, as: :polymorphic_entity, class_name: BelongsToPolymorphicChild
|
22
|
+
has_many :children, as: :polymorphic_entity, class_name: 'BelongsToPolymorphicChild'
|
23
23
|
end
|
24
24
|
|
25
25
|
class SecondPolymorphicEntity < ActiveRecord::Base
|
26
|
-
has_many :children, as: :polymorphic_entity, class_name: BelongsToPolymorphicChild
|
26
|
+
has_many :children, as: :polymorphic_entity, class_name: 'BelongsToPolymorphicChild'
|
27
27
|
end
|
28
28
|
|
29
29
|
class BelongsToPolymorphicTest < Minitest::Test
|
data/test/belongs_to_test.rb
CHANGED
@@ -11,11 +11,12 @@ ActiveRecord::Migration.create_table :belongs_to_simple_entity_children, :force
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class BelongsToSimpleEntity < ActiveRecord::Base
|
14
|
-
has_many :simple_entity_children, primary_key: :my_id, foreign_key: :parent_id, class_name:
|
14
|
+
has_many :simple_entity_children, primary_key: :my_id, foreign_key: :parent_id, class_name: 'BelongsToSimpleEntityChild'
|
15
|
+
has_many :unnamed_children, -> { where name: nil }, primary_key: :my_id, foreign_key: :parent_id, class_name: 'BelongsToSimpleEntityChild'
|
15
16
|
end
|
16
17
|
|
17
18
|
class BelongsToSimpleEntityChild < ActiveRecord::Base
|
18
|
-
belongs_to :simple_entity, foreign_key: :parent_id, primary_key: :my_id, class_name:
|
19
|
+
belongs_to :simple_entity, foreign_key: :parent_id, primary_key: :my_id, class_name: 'BelongsToSimpleEntity'
|
19
20
|
end
|
20
21
|
|
21
22
|
class BelongsToTest < Minitest::Test
|
@@ -46,4 +47,34 @@ class BelongsToTest < Minitest::Test
|
|
46
47
|
assert_equal 1, result.length
|
47
48
|
assert_equal result.first.id, child.id
|
48
49
|
end
|
50
|
+
|
51
|
+
def test_with_parameters
|
52
|
+
wrong_child = BelongsToSimpleEntityChild.create!(name: 'wrong')
|
53
|
+
child = BelongsToSimpleEntityChild.create!(name: 'right')
|
54
|
+
|
55
|
+
_blank_entity = BelongsToSimpleEntity.create!(my_id: 999)
|
56
|
+
_wrong_entity = BelongsToSimpleEntity.create!(simple_entity_children: [wrong_child], my_id: 500)
|
57
|
+
entity = BelongsToSimpleEntity.create!(name: 'this field is irrelevant', simple_entity_children: [child], my_id: 300)
|
58
|
+
|
59
|
+
result = BelongsToSimpleEntity.where_exists(:simple_entity_children, name: 'right')
|
60
|
+
|
61
|
+
assert_equal 1, result.length
|
62
|
+
assert_equal result.first.id, entity.id
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_with_condition
|
66
|
+
child_1 = BelongsToSimpleEntityChild.create! name: nil
|
67
|
+
child_2 = BelongsToSimpleEntityChild.create! name: 'Luke'
|
68
|
+
|
69
|
+
entity_1 = BelongsToSimpleEntity.create!(simple_entity_children: [child_1], my_id: 999)
|
70
|
+
entity_2 = BelongsToSimpleEntity.create!(simple_entity_children: [child_2], my_id: 500)
|
71
|
+
|
72
|
+
result = BelongsToSimpleEntity.unscoped.where_exists(:unnamed_children)
|
73
|
+
assert_equal 1, result.length
|
74
|
+
assert_equal result.first.id, entity_1.id
|
75
|
+
|
76
|
+
result = BelongsToSimpleEntity.unscoped.where_not_exists(:unnamed_children)
|
77
|
+
assert_equal 1, result.length
|
78
|
+
assert_equal result.first.id, entity_2.id
|
79
|
+
end
|
49
80
|
end
|
data/test/db/test.db
CHANGED
Binary file
|
@@ -19,11 +19,11 @@ class HasManyPolymorphicChild < ActiveRecord::Base
|
|
19
19
|
end
|
20
20
|
|
21
21
|
class RelevantPolymorphicEntity < ActiveRecord::Base
|
22
|
-
has_many :children, as: :polymorphic_thing, class_name: HasManyPolymorphicChild
|
22
|
+
has_many :children, as: :polymorphic_thing, class_name: 'HasManyPolymorphicChild'
|
23
23
|
end
|
24
24
|
|
25
25
|
class IrrelevantPolymorphicEntity < ActiveRecord::Base
|
26
|
-
has_many :children, as: :polymorphic_thing, class_name: HasManyPolymorphicChild
|
26
|
+
has_many :children, as: :polymorphic_thing, class_name: 'HasManyPolymorphicChild'
|
27
27
|
end
|
28
28
|
|
29
29
|
class HasManyPolymorphicTest < Minitest::Test
|
data/test/has_many_test.rb
CHANGED
@@ -12,6 +12,7 @@ end
|
|
12
12
|
|
13
13
|
class SimpleEntity < ActiveRecord::Base
|
14
14
|
has_many :simple_entity_children, primary_key: :my_id, foreign_key: :parent_id
|
15
|
+
has_many :unnamed_children, -> { where name: nil }, primary_key: :my_id, foreign_key: :parent_id, class_name: 'SimpleEntityChild'
|
15
16
|
end
|
16
17
|
|
17
18
|
class SimpleEntityChild < ActiveRecord::Base
|
@@ -59,6 +60,22 @@ class HasManyTest < Minitest::Test
|
|
59
60
|
assert_equal result.first.id, entity.id
|
60
61
|
end
|
61
62
|
|
63
|
+
def test_with_condition
|
64
|
+
child_1 = SimpleEntityChild.create! name: nil
|
65
|
+
child_2 = SimpleEntityChild.create! name: 'Luke'
|
66
|
+
|
67
|
+
entity_1 = SimpleEntity.create!(simple_entity_children: [child_1], my_id: 999)
|
68
|
+
entity_2 = SimpleEntity.create!(simple_entity_children: [child_2], my_id: 500)
|
69
|
+
|
70
|
+
result = SimpleEntity.unscoped.where_exists(:unnamed_children)
|
71
|
+
assert_equal 1, result.length
|
72
|
+
assert_equal result.first.id, entity_1.id
|
73
|
+
|
74
|
+
result = SimpleEntity.unscoped.where_not_exists(:unnamed_children)
|
75
|
+
assert_equal 1, result.length
|
76
|
+
assert_equal result.first.id, entity_2.id
|
77
|
+
end
|
78
|
+
|
62
79
|
def test_not_exists
|
63
80
|
child = SimpleEntityChild.create!
|
64
81
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: where_exists
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eugene Zolotarev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -16,7 +16,7 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '4.2'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '6'
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: '4.2'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '6'
|
@@ -97,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
97
|
version: '0'
|
98
98
|
requirements: []
|
99
99
|
rubyforge_project:
|
100
|
-
rubygems_version: 2.
|
100
|
+
rubygems_version: 2.6.11
|
101
101
|
signing_key:
|
102
102
|
specification_version: 4
|
103
103
|
summary: "#where_exists extension of ActiveRecord"
|