active_record_extended 2.0.3 → 2.2.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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -9
  3. data/lib/active_record_extended/active_record/relation_patch.rb +16 -4
  4. data/lib/active_record_extended/active_record.rb +6 -6
  5. data/lib/active_record_extended/arel/nodes.rb +1 -1
  6. data/lib/active_record_extended/arel/visitors/postgresql_decorator.rb +16 -12
  7. data/lib/active_record_extended/query_methods/any_of.rb +1 -1
  8. data/lib/active_record_extended/query_methods/either.rb +5 -3
  9. data/lib/active_record_extended/query_methods/unionize.rb +3 -3
  10. data/lib/active_record_extended/query_methods/where_chain.rb +5 -1
  11. data/lib/active_record_extended/query_methods/with_cte.rb +2 -2
  12. data/lib/active_record_extended/version.rb +1 -1
  13. metadata +11 -59
  14. data/lib/active_record_extended/patch/5_1/where_clause.rb +0 -11
  15. data/spec/active_record_extended_spec.rb +0 -7
  16. data/spec/query_methods/any_of_spec.rb +0 -131
  17. data/spec/query_methods/array_query_spec.rb +0 -64
  18. data/spec/query_methods/either_spec.rb +0 -70
  19. data/spec/query_methods/hash_query_spec.rb +0 -45
  20. data/spec/query_methods/inet_query_spec.rb +0 -112
  21. data/spec/query_methods/json_spec.rb +0 -157
  22. data/spec/query_methods/select_spec.rb +0 -115
  23. data/spec/query_methods/unionize_spec.rb +0 -165
  24. data/spec/query_methods/window_spec.rb +0 -51
  25. data/spec/query_methods/with_cte_spec.rb +0 -50
  26. data/spec/spec_helper.rb +0 -28
  27. data/spec/sql_inspections/any_of_sql_spec.rb +0 -41
  28. data/spec/sql_inspections/arel/aggregate_function_name_spec.rb +0 -41
  29. data/spec/sql_inspections/arel/array_spec.rb +0 -63
  30. data/spec/sql_inspections/arel/inet_spec.rb +0 -66
  31. data/spec/sql_inspections/contains_sql_queries_spec.rb +0 -47
  32. data/spec/sql_inspections/either_sql_spec.rb +0 -71
  33. data/spec/sql_inspections/json_sql_spec.rb +0 -82
  34. data/spec/sql_inspections/unionize_sql_spec.rb +0 -124
  35. data/spec/sql_inspections/window_sql_spec.rb +0 -98
  36. data/spec/sql_inspections/with_cte_sql_spec.rb +0 -95
  37. data/spec/support/database_cleaner.rb +0 -15
  38. data/spec/support/models.rb +0 -80
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bbcdc3e208ac89fd2d55b8944ad7c0483e57f21a89941a4848beb548b56ce293
4
- data.tar.gz: 10465bfe73686aae4fad33a7da0e533ed22401c68da5655654e1538a8bbb34c0
3
+ metadata.gz: 3f8d2f193f9e0e50c6e83e462c1df30a9b948779ebf3e00f64c735f165bdb5f3
4
+ data.tar.gz: 0ee6d70e9b6714c6ab3431da2df340ff63fca28bc0ceb6fc2c3e45593b9e87e0
5
5
  SHA512:
6
- metadata.gz: 1ed8f4d6fe19c384bbb8add11443cc78b6f23cf4adc1808bdd0a1b6328a2dbeac22d4e0fa8fc6257dde505646d1c3613ed90711bbd36321cbb74231cf621958d
7
- data.tar.gz: e139454fc996ad112d70332e39b002ba164d2172100f6b61f2494f090a0a3afe16c0e5e51998ab8f8cb8e839c6b0cb1104d152f821ae65d55bec4c83ec9c990a
6
+ metadata.gz: 282ad3881cb0ed581dbe1aa0dd605dbc33cb7182d560a015f2de5a57a1ca49f3db8e5b5515229d527130e6f7f35321105bface3669edb15340b1bb76e333d7c4
7
+ data.tar.gz: c7b38bca14c8ed07faba4f2996a18c455b85dec7def64e184c1a8dc9defa86681c1650b9097112264248c66580685f2f90825e9cf04d981e48b47333e091bde2
data/README.md CHANGED
@@ -52,12 +52,12 @@ Active Record Extended is essentially providing users with the other half of Pos
52
52
  ## Compatibility
53
53
 
54
54
  This package is designed align and work with any officially supported Ruby and Rails versions.
55
- - Minimum Ruby Version: 2.4.x **(EOL warning!)**
56
- - Minimum Rails Version: 5.1.x **(EOL warning!)**
57
- - Minimum Postgres Version: 9.6.x **(EOL warning!)**
58
- - Latest Ruby supported: 2.7.x
59
- - Latest Rails supported: 6.1.x
60
- - Postgres: 9.6-current(13) (probably works with most older versions to a certain point)
55
+ - Minimum Ruby Version: 2.5.x **(EOL warning!)**
56
+ - Minimum Rails Version: 5.2.x **(EOL warning!)**
57
+ - Minimum Postgres Version: 10.x **(EOL warning!)**
58
+ - Latest Ruby supported: 3.0.x
59
+ - Latest Rails supported: 7.0.x
60
+ - Postgres: 10-current(14) (probably works with most older versions to a certain point)
61
61
 
62
62
  ## Installation
63
63
 
@@ -649,12 +649,12 @@ SELECT "people".*
649
649
 
650
650
  ```ruby
651
651
  users = Person.where(id: 1..5)
652
- expect_these_users = Person.where(id: 2..4)
652
+ except_these_users = Person.where(id: 2..4)
653
653
 
654
- Person.union_except(users, expect_these_users) #=> [#<Person id: 1, ..>, #<Person id: 5,..>]
654
+ Person.union_except(users, except_these_users) #=> [#<Person id: 1, ..>, #<Person id: 5,..>]
655
655
 
656
656
  # You can also chain union's
657
- Person.union.except(users, expect_these_users).union(Person.where(id: 20))
657
+ Person.union.except(users, except_these_users).union(Person.where(id: 20))
658
658
  ```
659
659
 
660
660
  Query Output
@@ -13,15 +13,27 @@ module ActiveRecordExtended
13
13
  end
14
14
 
15
15
  module Merger
16
- def normal_values
17
- super + [:union, :define_window]
18
- end
19
-
20
16
  def merge
21
17
  merge_ctes!
18
+ merge_union!
19
+ merge_windows!
22
20
  super
23
21
  end
24
22
 
23
+ def merge_union!
24
+ return if other.unionize_storage.empty?
25
+
26
+ relation.union_values += other.union_values
27
+ relation.union_operations += other.union_operations
28
+ relation.union_ordering_values += other.union_ordering_values
29
+ end
30
+
31
+ def merge_windows!
32
+ return unless other.window_values?
33
+
34
+ relation.window_values |= other.window_values
35
+ end
36
+
25
37
  def merge_ctes!
26
38
  return unless other.with_values?
27
39
 
@@ -5,6 +5,11 @@ require "active_record/relation"
5
5
  require "active_record/relation/merger"
6
6
  require "active_record/relation/query_methods"
7
7
 
8
+ module ActiveRecordExtended
9
+ # TODO: Deprecate <= AR 6.0 methods & routines
10
+ AR_VERSION_GTE_6_1 = Gem::Requirement.new(">= 6.1").satisfied_by?(ActiveRecord.gem_version)
11
+ end
12
+
8
13
  require "active_record_extended/predicate_builder/array_handler_decorator"
9
14
 
10
15
  require "active_record_extended/active_record/relation_patch"
@@ -17,9 +22,4 @@ require "active_record_extended/query_methods/either"
17
22
  require "active_record_extended/query_methods/inet"
18
23
  require "active_record_extended/query_methods/json"
19
24
  require "active_record_extended/query_methods/select"
20
-
21
- if Gem::Requirement.new("~> 5.1.0").satisfied_by?(ActiveRecord.gem_version)
22
- require "active_record_extended/patch/5_1/where_clause"
23
- else
24
- require "active_record_extended/patch/5_2/where_clause"
25
- end
25
+ require "active_record_extended/patch/5_2/where_clause"
@@ -5,7 +5,7 @@ require "arel/nodes/function"
5
5
 
6
6
  module Arel
7
7
  module Nodes
8
- if Gem::Requirement.new("< 6.1").satisfied_by?(ActiveRecord.gem_version)
8
+ unless ActiveRecordExtended::AR_VERSION_GTE_6_1
9
9
  ["Contains", "Overlaps"].each { |binary_node_name| const_set(binary_node_name, Class.new(::Arel::Nodes::Binary)) }
10
10
  end
11
11
 
@@ -9,21 +9,25 @@ module ActiveRecordExtended
9
9
 
10
10
  # rubocop:disable Naming/MethodName
11
11
 
12
- def visit_Arel_Nodes_Overlaps(object, collector)
13
- infix_value object, collector, " && "
12
+ unless ActiveRecordExtended::AR_VERSION_GTE_6_1
13
+ def visit_Arel_Nodes_Overlaps(object, collector)
14
+ infix_value object, collector, " && "
15
+ end
14
16
  end
15
17
 
16
- def visit_Arel_Nodes_Contains(object, collector)
17
- left_column = object.left.relation.name.classify.constantize.columns.detect do |col|
18
- matchable_column?(col, object)
19
- end
18
+ unless ActiveRecordExtended::AR_VERSION_GTE_6_1
19
+ def visit_Arel_Nodes_Contains(object, collector)
20
+ left_column = object.left.relation.name.classify.constantize.columns.detect do |col|
21
+ matchable_column?(col, object)
22
+ end
20
23
 
21
- if [:hstore, :jsonb].include?(left_column&.type)
22
- visit_Arel_Nodes_ContainsHStore(object, collector)
23
- elsif left_column.try(:array)
24
- visit_Arel_Nodes_ContainsArray(object, collector)
25
- else
26
- visit_Arel_Nodes_Inet_Contains(object, collector)
24
+ if [:hstore, :jsonb].include?(left_column&.type)
25
+ visit_Arel_Nodes_ContainsHStore(object, collector)
26
+ elsif left_column.try(:array)
27
+ visit_Arel_Nodes_ContainsArray(object, collector)
28
+ else
29
+ visit_Arel_Nodes_Inet_Contains(object, collector)
30
+ end
27
31
  end
28
32
  end
29
33
 
@@ -29,7 +29,7 @@ module ActiveRecordExtended
29
29
 
30
30
  def hash_map_queries(queries)
31
31
  if queries.size == 1 && queries.first.is_a?(Hash)
32
- queries.first.each_pair.map { |attr, predicate| Hash[attr, predicate] }
32
+ queries.first.each_pair.map { |attr, predicate| { attr => predicate } }
33
33
  else
34
34
  queries
35
35
  end
@@ -26,7 +26,7 @@ module ActiveRecordExtended
26
26
  private
27
27
 
28
28
  def xor_field_sql(options)
29
- XOR_FIELD_SQL % Hash[xor_field_options(options)]
29
+ XOR_FIELD_SQL % xor_field_options(options).to_h
30
30
  end
31
31
 
32
32
  def sort_order_sql(dir)
@@ -35,7 +35,7 @@ module ActiveRecordExtended
35
35
 
36
36
  def xor_field_options(options)
37
37
  str_args = options.flatten.take(XOR_FIELD_KEYS.size).map(&:to_s)
38
- Hash[XOR_FIELD_KEYS.zip(str_args)]
38
+ XOR_FIELD_KEYS.zip(str_args).to_h
39
39
  end
40
40
 
41
41
  def map_columns_to_tables(associations_and_columns)
@@ -60,4 +60,6 @@ module ActiveRecordExtended
60
60
  end
61
61
  end
62
62
 
63
- ActiveRecord::Base.extend(ActiveRecordExtended::QueryMethods::Either)
63
+ ActiveSupport.on_load :active_record do
64
+ extend(ActiveRecordExtended::QueryMethods::Either)
65
+ end
@@ -107,7 +107,7 @@ module ActiveRecordExtended
107
107
  end
108
108
 
109
109
  def union(opts = :chain, *args)
110
- return UnionChain.new(spawn) if :chain == opts
110
+ return UnionChain.new(spawn) if opts == :chain
111
111
 
112
112
  opts.nil? ? self : spawn.union!(opts, *args, chain_method: __callee__)
113
113
  end
@@ -121,7 +121,7 @@ module ActiveRecordExtended
121
121
  def union!(opts = :chain, *args, chain_method: :union)
122
122
  union_chain = UnionChain.new(self)
123
123
  chain_method ||= :union
124
- return union_chain if :chain == opts
124
+ return union_chain if opts == :chain
125
125
 
126
126
  union_chain.public_send(chain_method, *([opts] + args))
127
127
  end
@@ -178,7 +178,7 @@ module ActiveRecordExtended
178
178
  def build_union_nodes!(raise_error = true)
179
179
  unionize_error_or_warn!(raise_error)
180
180
  union_values.each_with_index.reduce(nil) do |union_node, (relation_node, index)|
181
- next resolve_relation_node(relation_node) if union_node.nil?
181
+ next resolve_relation_node(relation_node) if union_node.nil? # rubocop:disable Lint/UnmodifiedReduceAccumulator
182
182
 
183
183
  operation = union_operations.fetch(index - 1, :union)
184
184
  left = union_node
@@ -45,6 +45,10 @@ module ActiveRecordExtended
45
45
  # # SELECT tags.* FROM tags INNER JOIN user on user.id = tags.user_id WHERE user.data @> { nickname: 'chainer' }
46
46
  #
47
47
  def contains(opts, *rest)
48
+ if ActiveRecordExtended::AR_VERSION_GTE_6_1
49
+ return substitute_comparisons(opts, rest, Arel::Nodes::Contains, "contains")
50
+ end
51
+
48
52
  build_where_chain(opts, rest) do |arel|
49
53
  case arel
50
54
  when Arel::Nodes::In, Arel::Nodes::Equality
@@ -106,7 +110,7 @@ module ActiveRecordExtended
106
110
  end
107
111
 
108
112
  def build_where_clause_for(scope, opts, rest)
109
- if ActiveRecord::VERSION::MAJOR == 6 && ActiveRecord::VERSION::MINOR == 1
113
+ if ActiveRecordExtended::AR_VERSION_GTE_6_1
110
114
  scope.send(:build_where_clause, opts, rest)
111
115
  else
112
116
  scope.send(:where_clause_factory).build(opts, rest)
@@ -113,14 +113,14 @@ module ActiveRecordExtended
113
113
 
114
114
  # @param [Hash, WithCTE] opts
115
115
  def with(opts = :chain, *rest)
116
- return WithChain.new(spawn) if :chain == opts
116
+ return WithChain.new(spawn) if opts == :chain
117
117
 
118
118
  opts.blank? ? self : spawn.with!(opts, *rest)
119
119
  end
120
120
 
121
121
  # @param [Hash, WithCTE] opts
122
122
  def with!(opts = :chain, *_rest)
123
- return WithChain.new(self) if :chain == opts
123
+ return WithChain.new(self) if opts == :chain
124
124
 
125
125
  tap do |scope|
126
126
  scope.cte ||= WithCTE.new(self)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecordExtended
4
- VERSION = "2.0.3"
4
+ VERSION = "2.2.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_extended
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - George Protacio-Karaszi
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-06-25 00:00:00.000000000 Z
13
+ date: 2022-07-28 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -18,20 +18,20 @@ dependencies:
18
18
  requirements:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: '5.1'
21
+ version: '5.2'
22
22
  - - "<"
23
23
  - !ruby/object:Gem::Version
24
- version: '6.2'
24
+ version: 7.1.0
25
25
  type: :runtime
26
26
  prerelease: false
27
27
  version_requirements: !ruby/object:Gem::Requirement
28
28
  requirements:
29
29
  - - ">="
30
30
  - !ruby/object:Gem::Version
31
- version: '5.1'
31
+ version: '5.2'
32
32
  - - "<"
33
33
  - !ruby/object:Gem::Version
34
- version: '6.2'
34
+ version: 7.1.0
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: ar_outer_joins
37
37
  requirement: !ruby/object:Gem::Requirement
@@ -155,7 +155,6 @@ files:
155
155
  - lib/active_record_extended/arel/predications.rb
156
156
  - lib/active_record_extended/arel/sql_literal.rb
157
157
  - lib/active_record_extended/arel/visitors/postgresql_decorator.rb
158
- - lib/active_record_extended/patch/5_1/where_clause.rb
159
158
  - lib/active_record_extended/patch/5_2/where_clause.rb
160
159
  - lib/active_record_extended/predicate_builder/array_handler_decorator.rb
161
160
  - lib/active_record_extended/query_methods/any_of.rb
@@ -170,34 +169,11 @@ files:
170
169
  - lib/active_record_extended/utilities/order_by.rb
171
170
  - lib/active_record_extended/utilities/support.rb
172
171
  - lib/active_record_extended/version.rb
173
- - spec/active_record_extended_spec.rb
174
- - spec/query_methods/any_of_spec.rb
175
- - spec/query_methods/array_query_spec.rb
176
- - spec/query_methods/either_spec.rb
177
- - spec/query_methods/hash_query_spec.rb
178
- - spec/query_methods/inet_query_spec.rb
179
- - spec/query_methods/json_spec.rb
180
- - spec/query_methods/select_spec.rb
181
- - spec/query_methods/unionize_spec.rb
182
- - spec/query_methods/window_spec.rb
183
- - spec/query_methods/with_cte_spec.rb
184
- - spec/spec_helper.rb
185
- - spec/sql_inspections/any_of_sql_spec.rb
186
- - spec/sql_inspections/arel/aggregate_function_name_spec.rb
187
- - spec/sql_inspections/arel/array_spec.rb
188
- - spec/sql_inspections/arel/inet_spec.rb
189
- - spec/sql_inspections/contains_sql_queries_spec.rb
190
- - spec/sql_inspections/either_sql_spec.rb
191
- - spec/sql_inspections/json_sql_spec.rb
192
- - spec/sql_inspections/unionize_sql_spec.rb
193
- - spec/sql_inspections/window_sql_spec.rb
194
- - spec/sql_inspections/with_cte_sql_spec.rb
195
- - spec/support/database_cleaner.rb
196
- - spec/support/models.rb
197
172
  homepage: https://github.com/georgekaraszi/ActiveRecordExtended
198
173
  licenses:
199
174
  - MIT
200
- metadata: {}
175
+ metadata:
176
+ rubygems_mfa_required: 'true'
201
177
  post_install_message:
202
178
  rdoc_options: []
203
179
  require_paths:
@@ -206,39 +182,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
206
182
  requirements:
207
183
  - - ">="
208
184
  - !ruby/object:Gem::Version
209
- version: '2.4'
185
+ version: '2.5'
210
186
  required_rubygems_version: !ruby/object:Gem::Requirement
211
187
  requirements:
212
188
  - - ">="
213
189
  - !ruby/object:Gem::Version
214
190
  version: '0'
215
191
  requirements: []
216
- rubygems_version: 3.0.6
192
+ rubygems_version: 3.2.15
217
193
  signing_key:
218
194
  specification_version: 4
219
195
  summary: Adds extended functionality to Activerecord Postgres implementation
220
- test_files:
221
- - spec/active_record_extended_spec.rb
222
- - spec/query_methods/any_of_spec.rb
223
- - spec/query_methods/array_query_spec.rb
224
- - spec/query_methods/either_spec.rb
225
- - spec/query_methods/hash_query_spec.rb
226
- - spec/query_methods/inet_query_spec.rb
227
- - spec/query_methods/json_spec.rb
228
- - spec/query_methods/select_spec.rb
229
- - spec/query_methods/unionize_spec.rb
230
- - spec/query_methods/window_spec.rb
231
- - spec/query_methods/with_cte_spec.rb
232
- - spec/spec_helper.rb
233
- - spec/sql_inspections/any_of_sql_spec.rb
234
- - spec/sql_inspections/arel/aggregate_function_name_spec.rb
235
- - spec/sql_inspections/arel/array_spec.rb
236
- - spec/sql_inspections/arel/inet_spec.rb
237
- - spec/sql_inspections/contains_sql_queries_spec.rb
238
- - spec/sql_inspections/either_sql_spec.rb
239
- - spec/sql_inspections/json_sql_spec.rb
240
- - spec/sql_inspections/unionize_sql_spec.rb
241
- - spec/sql_inspections/window_sql_spec.rb
242
- - spec/sql_inspections/with_cte_sql_spec.rb
243
- - spec/support/database_cleaner.rb
244
- - spec/support/models.rb
196
+ test_files: []
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveRecordExtended
4
- module WhereClause
5
- def modified_predicates(&block)
6
- ::ActiveRecord::Relation::WhereClause.new(predicates.map(&block), binds)
7
- end
8
- end
9
- end
10
-
11
- ActiveRecord::Relation::WhereClause.prepend(ActiveRecordExtended::WhereClause)
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe ActiveRecordExtended do
4
- it "has a version number" do
5
- expect(ActiveRecordExtended::VERSION).not_to be nil
6
- end
7
- end
@@ -1,131 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe "Active Record Any / None of Methods" do
6
- let!(:one) { User.create!(personal_id: 1) }
7
- let!(:two) { User.create!(personal_id: 2) }
8
- let!(:three) { User.create!(personal_id: 3) }
9
-
10
- let!(:tag_one) { Tag.create!(user_id: one.id) }
11
- let!(:tag_two) { Tag.create!(user_id: two.id) }
12
- let!(:tag_three) { Tag.create!(user_id: three.id) }
13
-
14
- describe "where.any_of/1" do
15
- it "Should return queries that match any of the outlined queries" do
16
- query = User.where.any_of({ personal_id: 1 }, { personal_id: 2 })
17
- expect(query).to include(one, two)
18
- expect(query).to_not include(three)
19
- end
20
-
21
- it "Should accept where query predicates" do
22
- personal_one = User.where(personal_id: 1)
23
- personal_two = User.where(personal_id: 2)
24
- query = User.where.any_of(personal_one, personal_two)
25
-
26
- expect(query).to include(one, two)
27
- expect(query).to_not include(three)
28
- end
29
-
30
- it "Should accept query strings" do
31
- personal_one = User.where(personal_id: 1)
32
-
33
- query = User.where.any_of(personal_one, "personal_id > 2")
34
- expect(query).to include(one, three)
35
- expect(query).to_not include(two)
36
-
37
- query = User.where.any_of(["personal_id >= ?", 2])
38
- expect(query).to include(two, three)
39
- expect(query).to_not include(one)
40
- end
41
-
42
- context "Relationship queries" do
43
- it "Finds records that are queried from two or more has_many associations" do
44
- user_one_tag = Tag.create!(user_id: one.id)
45
- user_two_tag = Tag.create!(user_id: two.id)
46
- query = Tag.where.any_of(one.hm_tags, two.hm_tags)
47
-
48
- expect(query).to include(tag_one, tag_two, user_one_tag, user_two_tag)
49
- expect(query).to_not include(tag_three)
50
- end
51
-
52
- it "Finds records that are dynamically joined" do
53
- user_one_tag = Tag.where(users: { id: one.id }).includes(:user).references(:user)
54
- user_two_tag = Tag.where(users: { id: two.id }).joins(:user)
55
- query = Tag.where.any_of(user_one_tag, user_two_tag)
56
-
57
- expect(query).to include(tag_one, tag_two)
58
- expect(query).to_not include(tag_three)
59
- end
60
-
61
- it "Return matched records of a joined table on the parent level" do
62
- query = Tag.joins(:user).where.any_of(
63
- { users: { personal_id: 1 } },
64
- { users: { personal_id: 3 } }
65
- )
66
-
67
- expect(query).to include(tag_one, tag_three)
68
- expect(query).to_not include(tag_two)
69
- end
70
- end
71
- end
72
-
73
- describe "where.none_of/1" do
74
- it "Should return queries that match none of the outlined queries" do
75
- query = User.where.none_of({ personal_id: 1 }, { personal_id: 2 })
76
- expect(query).to include(three)
77
- expect(query).to_not include(one, two)
78
- end
79
-
80
- it "Should accept where query predicates" do
81
- personal_one = User.where(personal_id: 1)
82
- personal_two = User.where(personal_id: 2)
83
- query = User.where.none_of(personal_one, personal_two)
84
-
85
- expect(query).to include(three)
86
- expect(query).to_not include(one, two)
87
- end
88
-
89
- it "Should accept query strings" do
90
- personal_one = User.where(personal_id: 1)
91
-
92
- query = User.where.none_of(personal_one, "personal_id > 2")
93
- expect(query).to include(two)
94
- expect(query).to_not include(one, three)
95
-
96
- query = User.where.none_of(["personal_id >= ?", 2])
97
- expect(query).to include(one)
98
- expect(query).to_not include(two, three)
99
- end
100
-
101
- context "Relationship queries" do
102
- it "Finds records that are queried from two or more has_many associations" do
103
- user_one_tag = Tag.create!(user_id: one.id)
104
- user_two_tag = Tag.create!(user_id: two.id)
105
- query = Tag.where.none_of(one.hm_tags, two.hm_tags)
106
-
107
- expect(query).to include(tag_three)
108
- expect(query).to_not include(tag_one, tag_two, user_one_tag, user_two_tag)
109
- end
110
-
111
- it "Finds records that are dynamically joined" do
112
- user_one_tag = Tag.where(users: { id: one.id }).includes(:user).references(:user)
113
- user_two_tag = Tag.where(users: { id: two.id }).joins(:user)
114
- query = Tag.where.none_of(user_one_tag, user_two_tag)
115
-
116
- expect(query).to include(tag_three)
117
- expect(query).to_not include(tag_one, tag_two)
118
- end
119
-
120
- it "Return matched records of a joined table on the parent level" do
121
- query = Tag.joins(:user).where.none_of(
122
- { users: { personal_id: 1 } },
123
- { users: { personal_id: 3 } }
124
- )
125
-
126
- expect(query).to include(tag_two)
127
- expect(query).to_not include(tag_one, tag_three)
128
- end
129
- end
130
- end
131
- end
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- RSpec.describe "Active Record Array Query Methods" do
6
- let!(:one) { User.create!(tags: [1, 2, 3], personal_id: 33) }
7
- let!(:two) { User.create!(tags: [3, 1, 5], personal_id: 88) }
8
- let!(:three) { User.create!(tags: [2, 8, 20], personal_id: 33) }
9
-
10
- describe "#overlap" do
11
- it "Should return matched records" do
12
- query = User.where.overlap(tags: [1])
13
- expect(query).to include(one, two)
14
- expect(query).to_not include(three)
15
-
16
- query = User.where.overlap(tags: [2, 3])
17
- expect(query).to include(one, two, three)
18
- end
19
- end
20
-
21
- describe "#contains" do
22
- it "returns records that contain elements in an array" do
23
- query = User.where.contains(tags: [1, 3])
24
- expect(query).to include(one, two)
25
- expect(query).to_not include(three)
26
-
27
- query = User.where.contains(tags: [8, 2])
28
- expect(query).to include(three)
29
- expect(query).to_not include(one, two)
30
- end
31
- end
32
-
33
- describe "#any" do
34
- it "should return any records that match" do
35
- query = User.where.any(tags: 3)
36
- expect(query).to include(one, two)
37
- expect(query).to_not include(three)
38
- end
39
-
40
- it "allows chaining" do
41
- query = User.where.any(tags: 3).where(personal_id: 33)
42
- expect(query).to include(one)
43
- expect(query).to_not include(two, three)
44
- end
45
- end
46
-
47
- describe "#all" do
48
- let!(:contains_all) { User.create!(tags: [1], personal_id: 1) }
49
- let!(:contains_all_two) { User.create!(tags: [1], personal_id: 2) }
50
- let!(:contains_some) { User.create!(tags: [1, 2], personal_id: 2) }
51
-
52
- it "should return any records that match" do
53
- query = User.where.all(tags: 1)
54
- expect(query).to include(contains_all, contains_all_two)
55
- expect(query).to_not include(contains_some)
56
- end
57
-
58
- it "allows chaining" do
59
- query = User.where.all(tags: 1).where(personal_id: 1)
60
- expect(query).to include(contains_all)
61
- expect(query).to_not include(contains_all_two, contains_some)
62
- end
63
- end
64
- end