scoped_search 3.2.1 → 3.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/scoped_search/query_builder.rb +12 -1
- data/lib/scoped_search/version.rb +1 -1
- data/spec/integration/relation_querying_spec.rb +106 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3291810a245c631791ecafd20c61946c46f7edc1
|
4
|
+
data.tar.gz: cb14f9b463fa22b0537f48fcda37ecdd836302bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43d3a5b905d957079ea970b3f7e936fc453200811edd3017f257fc9f0d052cececffc7ea6e1a4a073ddc909df3b5d0d0b34393aea6c24aebefba69cb4e284f20
|
7
|
+
data.tar.gz: 1fe059d3579a6c51bb3c29c977bd956dc0294c6993098bebb4712ece85854ddead8d7d294ff02fb63914db8020cb9e405a1e864ee4b6ee3776b40251b4aa15ea
|
@@ -246,6 +246,16 @@ module ScopedSearch
|
|
246
246
|
end
|
247
247
|
end
|
248
248
|
|
249
|
+
def find_has_many_through_association(field, through)
|
250
|
+
middle_table_association = nil
|
251
|
+
field.klass.reflect_on_all_associations(:has_many).each do |reflection|
|
252
|
+
class_name = reflection.options[:class_name].constantize.table_name if reflection.options[:class_name]
|
253
|
+
middle_table_association = reflection.name if class_name == through.to_s
|
254
|
+
middle_table_association = reflection.plural_name if reflection.plural_name == through.to_s
|
255
|
+
end
|
256
|
+
middle_table_association
|
257
|
+
end
|
258
|
+
|
249
259
|
def has_many_through_join(field)
|
250
260
|
many_class = field.definition.klass
|
251
261
|
through = definition.reflection_by_name(many_class, field.relation).options[:through]
|
@@ -261,7 +271,8 @@ module ScopedSearch
|
|
261
271
|
condition1 = field.reflection_conditions(definition.reflection_by_name(field.klass, many_table_name))
|
262
272
|
|
263
273
|
# primary and foreign keys + optional condition for the endpoint to middle join
|
264
|
-
|
274
|
+
middle_table_association = find_has_many_through_association(field, through) || middle_table_name
|
275
|
+
pk2, fk2 = field.reflection_keys(definition.reflection_by_name(field.klass, middle_table_association))
|
265
276
|
condition2 = field.reflection_conditions(definition.reflection_by_name(many_class, field.relation))
|
266
277
|
|
267
278
|
<<-SQL
|
@@ -417,7 +417,113 @@ ScopedSearch::RSpec::Database.test_databases.each do |db|
|
|
417
417
|
it "should find the 3 tags that are related to dogs record" do
|
418
418
|
Tag.search_for('baz').length.should == 3
|
419
419
|
end
|
420
|
+
end
|
421
|
+
|
422
|
+
|
423
|
+
context 'querying a :has_many => :through relation with alternate name' do
|
424
|
+
|
425
|
+
before do
|
426
|
+
|
427
|
+
# Create some tables
|
428
|
+
ActiveRecord::Migration.create_table(:zaps) { |t| t.integer :moo_id; t.integer :paz_id }
|
429
|
+
ActiveRecord::Migration.create_table(:pazs) { |t| t.string :related }
|
430
|
+
ActiveRecord::Migration.create_table(:moos) { |t| t.string :foo }
|
431
|
+
|
432
|
+
# The related classes
|
433
|
+
class Zap < ActiveRecord::Base; belongs_to :paz; belongs_to :moo; end
|
434
|
+
class Paz < ActiveRecord::Base; has_many :other_zaps, :class_name => "Zap", :foreign_key => :paz_id; end
|
435
|
+
|
436
|
+
# The class on which to call search_for
|
437
|
+
class Moo < ActiveRecord::Base
|
438
|
+
has_many :zaps
|
439
|
+
has_many :pazs, :through => :zaps
|
440
|
+
|
441
|
+
scoped_search :in => :pazs, :on => :related
|
442
|
+
end
|
443
|
+
|
444
|
+
@moo_1 = Moo.create!(:foo => 'foo')
|
445
|
+
@moo_2 = Moo.create!(:foo => 'foo too')
|
446
|
+
@moo_3 = Moo.create!(:foo => 'foo three')
|
447
|
+
|
448
|
+
@paz_1 = Paz.create(:related => 'paz')
|
449
|
+
@paz_2 = Paz.create(:related => 'paz too!')
|
450
|
+
|
451
|
+
@bar_1 = Zap.create!(:moo => @moo_1, :paz => @paz_1)
|
452
|
+
@bar_2 = Zap.create!(:moo => @moo_1)
|
453
|
+
@bar_3 = Zap.create!(:moo => @moo_2, :paz => @paz_1)
|
454
|
+
@bar_3 = Zap.create!(:moo => @moo_2, :paz => @paz_2)
|
455
|
+
@bar_3 = Zap.create!(:moo => @moo_2, :paz => @paz_2)
|
456
|
+
@bar_4 = Zap.create!(:moo => @moo_3)
|
457
|
+
end
|
458
|
+
|
459
|
+
after do
|
460
|
+
ActiveRecord::Migration.drop_table(:pazs)
|
461
|
+
ActiveRecord::Migration.drop_table(:zaps)
|
462
|
+
ActiveRecord::Migration.drop_table(:moos)
|
463
|
+
end
|
464
|
+
|
465
|
+
it "should find the two records that are related to a paz record" do
|
466
|
+
Moo.search_for('paz').length.should == 2
|
467
|
+
end
|
468
|
+
|
469
|
+
it "should find the one record that is related to two paz records" do
|
470
|
+
Moo.search_for('related=paz AND related="paz too!"').length.should == 1
|
471
|
+
end
|
472
|
+
end
|
473
|
+
|
474
|
+
|
475
|
+
context 'querying a :has_many => :through relation with modules' do
|
476
|
+
|
477
|
+
before do
|
478
|
+
|
479
|
+
# Create some tables with namespaces
|
480
|
+
ActiveRecord::Migration.create_table(:zan_mars) { |t| t.integer :koo_id; t.integer :baz_id }
|
481
|
+
ActiveRecord::Migration.create_table(:zan_bazs) { |t| t.string :related }
|
482
|
+
ActiveRecord::Migration.create_table(:zan_koos) { |t| t.string :foo }
|
483
|
+
|
484
|
+
# The related classes
|
485
|
+
module Zan; class Mar < ActiveRecord::Base; belongs_to :baz; belongs_to :koo; self.table_name = "zan_mars"; end; end
|
486
|
+
module Zan; class Baz < ActiveRecord::Base; has_many :mars; self.table_name = "zan_bazs"; end; end
|
487
|
+
|
488
|
+
# The class on which to call search_for
|
489
|
+
module Zan
|
490
|
+
class Koo < ActiveRecord::Base
|
491
|
+
has_many :mars, :class_name => "Zan::Mar"
|
492
|
+
has_many :bazs, :through => :mars
|
493
|
+
self.table_name = "zan_koos"
|
494
|
+
|
495
|
+
scoped_search :in => :bazs, :on => :related
|
496
|
+
end
|
497
|
+
end
|
420
498
|
|
499
|
+
@koo_1 = Zan::Koo.create!(:foo => 'foo')
|
500
|
+
@koo_2 = Zan::Koo.create!(:foo => 'foo too')
|
501
|
+
@koo_3 = Zan::Koo.create!(:foo => 'foo three')
|
502
|
+
|
503
|
+
@baz_1 = Zan::Baz.create(:related => 'baz')
|
504
|
+
@baz_2 = Zan::Baz.create(:related => 'baz too!')
|
505
|
+
|
506
|
+
@bar_1 = Zan::Mar.create!(:koo => @koo_1, :baz => @baz_1)
|
507
|
+
@bar_2 = Zan::Mar.create!(:koo => @koo_1)
|
508
|
+
@bar_3 = Zan::Mar.create!(:koo => @koo_2, :baz => @baz_1)
|
509
|
+
@bar_3 = Zan::Mar.create!(:koo => @koo_2, :baz => @baz_2)
|
510
|
+
@bar_3 = Zan::Mar.create!(:koo => @koo_2, :baz => @baz_2)
|
511
|
+
@bar_4 = Zan::Mar.create!(:koo => @koo_3)
|
512
|
+
end
|
513
|
+
|
514
|
+
after do
|
515
|
+
ActiveRecord::Migration.drop_table(:zan_bazs)
|
516
|
+
ActiveRecord::Migration.drop_table(:zan_mars)
|
517
|
+
ActiveRecord::Migration.drop_table(:zan_koos)
|
518
|
+
end
|
519
|
+
|
520
|
+
it "should find the two records that are related to a baz record" do
|
521
|
+
Zan::Koo.search_for('baz').length.should == 2
|
522
|
+
end
|
523
|
+
|
524
|
+
it "should find the one record that is related to two baz records" do
|
525
|
+
Zan::Koo.search_for('related=baz AND related="baz too!"').length.should == 1
|
526
|
+
end
|
421
527
|
end
|
422
528
|
end
|
423
529
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scoped_search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.
|
4
|
+
version: 3.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Amos Benari
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-
|
13
|
+
date: 2015-07-28 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|