activerecord-filter 6.0.0.5 → 6.0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0ef3877f5047f8f16789ea877a6c421cbeeba6cfba9bea4890bcce2aaaec09b2
4
- data.tar.gz: e16bb046aa1e24771725827fddeaaf303e47482ce25433c1a143cc5df8e89bb6
3
+ metadata.gz: c34aa8bbd31df158c37ad5a80c46c31dff156bfb2a6e0bbb7e699d8919eb9aa1
4
+ data.tar.gz: eb154ad06ccc2b7b24c4b7ebea90bd4708b95a92db2b7d8fd92f74e2ca71c4c6
5
5
  SHA512:
6
- metadata.gz: 491c8cbdc786ae5ee5ad860e65c5ee58ac7d8b73095e0796dfc95d151ccab22f490b50bcc6b56089725fda38dd897100b02a6398ac41e119c194733eb0e420a4
7
- data.tar.gz: 65ff30c9eee91d80198d78ad4b86cb71a14cacec38cc181af1081b3f1a69af84453f61c56413111b0da01affd5fe2fd89174dda10c4032f1ec81f54a6b0e254a
6
+ metadata.gz: 8d715a7a707abc56c16512e2aee2fe4fd4995e82466c3651d2caf14d38bb72f0201e0445c72614c4d295d05ccc6adf66666a1287644b33612d14aa472de804b9
7
+ data.tar.gz: 2f4535f34a7e762c4ce68abb18530e7f0b9ca9b7f8bd6a16e6389626f806806bc89a486104c17d61cb7361dc106437a203d0fe598ce8ace34136c23048282b66
@@ -59,9 +59,22 @@ module ActiveRecord
59
59
  end
60
60
  elsif reflection = klass._reflections[key.to_s]
61
61
  if value.is_a?(Hash)
62
- relations << {
63
- key => build_filter_joins(reflection.klass, value, [], custom)
64
- }
62
+ relations << if reflection.polymorphic?
63
+ join_klass = value[:as].safe_constantize
64
+
65
+ right_table = join_klass.arel_table.alias("#{join_klass.table_name}_as_#{reflection.name}")
66
+ left_table = reflection.active_record.arel_table
67
+
68
+ on = right_table[join_klass.primary_key].
69
+ eq(left_table[reflection.foreign_key]).
70
+ and(left_table[reflection.foreign_type].eq(join_klass.name))
71
+
72
+ left_table.join(right_table, Arel::Nodes::OuterJoin).on(on).join_sources
73
+ else
74
+ {
75
+ key => build_filter_joins(reflection.klass, value, [], custom)
76
+ }
77
+ end
65
78
  elsif value.is_a?(Array)
66
79
  value.each do |v|
67
80
  relations << {
@@ -276,6 +289,7 @@ module ActiveRecord
276
289
  raise "Not Supported: #{relation.name}"
277
290
  end
278
291
  end
292
+
279
293
  when :belongs_to
280
294
  if value == true || value == 'true'
281
295
  return table.arel_attribute(relation.foreign_key).not_eq(nil)
@@ -284,26 +298,32 @@ module ActiveRecord
284
298
  end
285
299
  end
286
300
 
287
- builder = self.class.new(TableMetadata.new(
288
- relation.klass,
289
- alias_tracker.aliased_table_for(
290
- relation.table_name,
291
- relation.alias_candidate(table.send(:arel_table).name),
292
- relation.klass.type_caster
293
- ),
294
- relation
295
- ))
301
+ builder = if relation.polymorphic?
302
+ value = value.dup
303
+ klass = value.delete(:as).safe_constantize
304
+
305
+ self.class.new(TableMetadata.new(
306
+ klass,
307
+ Arel::Table.new("#{klass.table_name}_as_#{relation.name}", type_caster: klass.type_caster),
308
+ relation
309
+ ))
310
+ else
311
+ self.class.new(TableMetadata.new(
312
+ relation.klass,
313
+ alias_tracker.aliased_table_for(
314
+ relation.table_name,
315
+ relation.alias_candidate(table.send(:arel_table).name),
316
+ relation.klass.type_caster
317
+ ),
318
+ relation
319
+ ))
320
+ end
296
321
  builder.build_from_filter_hash(value, relation_trail + [relation.name], alias_tracker)
297
322
  end
298
323
 
299
324
 
300
325
  def expand_filter_for_join_table(relation, value, relation_trail, alias_tracker)
301
326
  relation = relation.active_record._reflections[relation.active_record._reflections[relation.name.to_s].send(:delegate_reflection).options[:through].to_s]
302
- STDOUT.puts [
303
- relation.table_name,
304
- relation.alias_candidate(table.send(:arel_table).name)
305
-
306
- ].inspect
307
327
  builder = self.class.new(TableMetadata.new(
308
328
  relation.klass,
309
329
  alias_tracker.aliased_table_for(
@@ -380,7 +400,15 @@ class ActiveRecord::Relation
380
400
 
381
401
  def filter!(filters)
382
402
  js = ActiveRecord::PredicateBuilder.filter_joins(klass, filters)
383
- js.each { |j| joins!(j) if j.present? }
403
+ js.flatten.each do |j|
404
+ if j.is_a?(String)
405
+ joins!(j)
406
+ elsif j.is_a?(Arel::Nodes::Join)
407
+ joins!(j)
408
+ elsif j.present?
409
+ left_outer_joins!(j)
410
+ end
411
+ end
384
412
  @filters << filters
385
413
  self
386
414
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module Filter
3
- VERSION = '6.0.0.5'
3
+ VERSION = '6.0.0.6'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-filter
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0.5
4
+ version: 6.0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Bracy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-12 00:00:00.000000000 Z
11
+ date: 2020-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -211,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
211
  - !ruby/object:Gem::Version
212
212
  version: '0'
213
213
  requirements: []
214
- rubygems_version: 3.0.3
214
+ rubygems_version: 3.0.6
215
215
  signing_key:
216
216
  specification_version: 4
217
217
  summary: A safe way to accept user parameters and query against your ActiveRecord