scoped_search 4.1.1 → 4.1.2
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/CHANGELOG.rdoc +4 -0
- data/lib/scoped_search/query_builder.rb +14 -2
- data/lib/scoped_search/version.rb +1 -1
- data/spec/integration/relation_querying_spec.rb +96 -11
- 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: 31cbd8d30fd85c320926ca1ee4719f98e2860211
|
4
|
+
data.tar.gz: c502bfc5ef2f14ad4aec19b253b6e9942d316236
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 018d005d707959d03cabee90cca7c17450e719fe0e6a32124d153e21f709980b7aae8f98be22a2620531d3c07ebacc32e8de8889ef13165e98de4c9162ef9cf0
|
7
|
+
data.tar.gz: 4b6997024cb1e5ee01d3c7bc41a34b1ac31f77eae6e09ce885087645f5b530f264baeab5fd74c302ac7a42b38c45fc2740f81741ad03f6cc0ee39adda9cc89bd
|
data/CHANGELOG.rdoc
CHANGED
@@ -8,6 +8,10 @@ Please add an entry to the "Unreleased changes" section in your pull requests.
|
|
8
8
|
|
9
9
|
*Nothing yet*
|
10
10
|
|
11
|
+
=== Version 4.1.2
|
12
|
+
|
13
|
+
- Bugfix related to using polymorphic relations introduced in 4.1.1 (#170)
|
14
|
+
|
11
15
|
=== Version 4.1.1
|
12
16
|
|
13
17
|
- Bugfix related to quoting when building autocomplete queries for date fields (#167)
|
@@ -262,17 +262,22 @@ module ScopedSearch
|
|
262
262
|
def has_many_through_join(field)
|
263
263
|
many_class = field.definition.klass
|
264
264
|
through = definition.reflection_by_name(many_class, field.relation).options[:through]
|
265
|
+
through_class = definition.reflection_by_name(many_class, through).klass
|
265
266
|
|
266
267
|
connection = many_class.connection
|
267
268
|
|
268
269
|
# table names
|
269
270
|
endpoint_table_name = field.klass.table_name
|
270
271
|
many_table_name = many_class.table_name
|
271
|
-
middle_table_name =
|
272
|
+
middle_table_name = through_class.table_name
|
272
273
|
|
273
274
|
# primary and foreign keys + optional conditions for the joins
|
274
275
|
pk1, fk1 = field.reflection_keys(definition.reflection_by_name(many_class, through))
|
275
|
-
condition_many_to_middle =
|
276
|
+
condition_many_to_middle = if with_polymorphism?(many_class, field.klass, through, through_class)
|
277
|
+
field.reflection_conditions(definition.reflection_by_name(field.klass, many_table_name))
|
278
|
+
else
|
279
|
+
''
|
280
|
+
end
|
276
281
|
condition_middle_to_end = field.reflection_conditions(definition.reflection_by_name(field.klass, middle_table_name))
|
277
282
|
|
278
283
|
# primary and foreign keys + optional condition for the endpoint to middle join
|
@@ -289,6 +294,13 @@ module ScopedSearch
|
|
289
294
|
SQL
|
290
295
|
end
|
291
296
|
|
297
|
+
def with_polymorphism?(many_class, endpoint_class, through, through_class)
|
298
|
+
reflections = [definition.reflection_by_name(endpoint_class, through), definition.reflection_by_name(many_class, through)].compact
|
299
|
+
as = reflections.map(&:options).compact.map { |opt| opt[:as] }.compact
|
300
|
+
return false if as.empty?
|
301
|
+
definition.reflection_by_name(through_class, as.first).options[:polymorphic]
|
302
|
+
end
|
303
|
+
|
292
304
|
# This module gets included into the Field class to add SQL generation.
|
293
305
|
module Field
|
294
306
|
|
@@ -479,11 +479,11 @@ ScopedSearch::RSpec::Database.test_databases.each do |db|
|
|
479
479
|
ActiveRecord::Migration.create_table(:user_groups) { |t| t.integer :user_id; t.integer :group_id }
|
480
480
|
ActiveRecord::Migration.create_table(:conflicts) { |t| t.integer :group_id; t.integer :user_id }
|
481
481
|
ActiveRecord::Migration.create_table(:groups) { |t| t.string :related; t.integer :user_id }
|
482
|
-
ActiveRecord::Migration.create_table(:users) { |t| t.string :foo
|
482
|
+
ActiveRecord::Migration.create_table(:users) { |t| t.string :foo }
|
483
483
|
|
484
484
|
# The related classes
|
485
485
|
class UserGroup < ActiveRecord::Base; belongs_to :user; belongs_to :group; end
|
486
|
-
class Conflict < ActiveRecord::Base; belongs_to :user
|
486
|
+
class Conflict < ActiveRecord::Base; belongs_to :user; belongs_to :group; end
|
487
487
|
class Group < ActiveRecord::Base
|
488
488
|
has_many :user_groups
|
489
489
|
has_many :users, :through => :conflicts, :source_type => 'User', :source => :user
|
@@ -497,9 +497,9 @@ ScopedSearch::RSpec::Database.test_databases.each do |db|
|
|
497
497
|
scoped_search :relation => :groups, :on => :related
|
498
498
|
end
|
499
499
|
|
500
|
-
@user_1 = User.create!(:foo => 'foo'
|
501
|
-
@user_2 = User.create!(:foo => 'foo too'
|
502
|
-
@user_3 = User.create!(:foo => 'foo three'
|
500
|
+
@user_1 = User.create!(:foo => 'foo')
|
501
|
+
@user_2 = User.create!(:foo => 'foo too')
|
502
|
+
@user_3 = User.create!(:foo => 'foo three')
|
503
503
|
|
504
504
|
@group_1 = Group.create(:related => 'value')
|
505
505
|
@group_2 = Group.create(:related => 'value too!')
|
@@ -581,16 +581,29 @@ ScopedSearch::RSpec::Database.test_databases.each do |db|
|
|
581
581
|
context 'querying a :has_many => :through with polymorphism' do
|
582
582
|
before do
|
583
583
|
ActiveRecord::Migration.create_table(:subnets) { |t| t.string :name }
|
584
|
+
ActiveRecord::Migration.create_table(:domains) { |t| t.string :name }
|
584
585
|
ActiveRecord::Migration.create_table(:taxable_taxonomies) { |t| t.integer :taxable_id; t.integer :taxonomy_id; t.string :taxable_type }
|
585
586
|
ActiveRecord::Migration.create_table(:taxonomies) { |t| t.string :type; t.string :name }
|
586
587
|
|
588
|
+
module Taxonomix
|
589
|
+
def self.included(base)
|
590
|
+
base.class_eval do
|
591
|
+
has_many :taxable_taxonomies, :as => :taxable
|
592
|
+
has_many :locations, -> { where(:type => 'Location') }, :through => :taxable_taxonomies, :source => :taxonomy
|
593
|
+
has_many :organizations, -> { where(:type => 'Organization') }, :through => :taxable_taxonomies, :source => :taxonomy
|
594
|
+
|
595
|
+
scoped_search :relation => :locations, :on => :id, :rename => :location_id
|
596
|
+
scoped_search :relation => :organizations, :on => :id, :rename => :organization_id
|
597
|
+
end
|
598
|
+
end
|
599
|
+
end
|
600
|
+
|
587
601
|
class Subnet < ActiveRecord::Base
|
588
|
-
|
589
|
-
|
590
|
-
has_many :organizations, -> { where(:type => 'Organization') }, :through => :taxable_taxonomies, :source => :taxonomy
|
602
|
+
include Taxonomix
|
603
|
+
end
|
591
604
|
|
592
|
-
|
593
|
-
|
605
|
+
class Domain < ActiveRecord::Base
|
606
|
+
include Taxonomix
|
594
607
|
end
|
595
608
|
|
596
609
|
class TaxableTaxonomy < ActiveRecord::Base
|
@@ -614,15 +627,23 @@ ScopedSearch::RSpec::Database.test_databases.each do |db|
|
|
614
627
|
@subnet_a = Subnet.create!(:name => 'Subnet A')
|
615
628
|
@subnet_b = Subnet.create!(:name => 'Subnet B')
|
616
629
|
|
630
|
+
@domain_a = Domain.create!(:name => 'Domain A')
|
631
|
+
@domain_b = Domain.create!(:name => 'Domain B')
|
617
632
|
|
618
633
|
TaxableTaxonomy.create!(:taxable_id => @subnet_a.id, :taxonomy_id => @loc_a.id, :taxable_type => 'Subnet')
|
619
634
|
TaxableTaxonomy.create!(:taxable_id => @subnet_b.id, :taxonomy_id => @loc_b.id, :taxable_type => 'Subnet')
|
620
635
|
TaxableTaxonomy.create!(:taxable_id => @subnet_a.id, :taxonomy_id => @org_a.id, :taxable_type => 'Subnet')
|
621
|
-
TaxableTaxonomy.create!(:taxable_id => @subnet_b.id, :taxonomy_id => @
|
636
|
+
TaxableTaxonomy.create!(:taxable_id => @subnet_b.id, :taxonomy_id => @org_b.id, :taxable_type => 'Subnet')
|
637
|
+
|
638
|
+
TaxableTaxonomy.create!(:taxable_id => @domain_a.id, :taxonomy_id => @loc_a.id, :taxable_type => 'Domain')
|
639
|
+
TaxableTaxonomy.create!(:taxable_id => @domain_b.id, :taxonomy_id => @loc_b.id, :taxable_type => 'Domain')
|
640
|
+
TaxableTaxonomy.create!(:taxable_id => @domain_a.id, :taxonomy_id => @org_a.id, :taxable_type => 'Domain')
|
641
|
+
TaxableTaxonomy.create!(:taxable_id => @domain_b.id, :taxonomy_id => @org_b.id, :taxable_type => 'Domain')
|
622
642
|
end
|
623
643
|
|
624
644
|
after do
|
625
645
|
ActiveRecord::Migration.drop_table :subnets
|
646
|
+
ActiveRecord::Migration.drop_table :domains
|
626
647
|
ActiveRecord::Migration.drop_table :taxable_taxonomies
|
627
648
|
ActiveRecord::Migration.drop_table :taxonomies
|
628
649
|
end
|
@@ -635,5 +656,69 @@ ScopedSearch::RSpec::Database.test_databases.each do |db|
|
|
635
656
|
Subnet.search_for("organization_id = #{@org_a.id}").length.should == 1
|
636
657
|
end
|
637
658
|
end
|
659
|
+
|
660
|
+
context 'querying with multiple :has_many => :through and polymorphism' do
|
661
|
+
before do
|
662
|
+
ActiveRecord::Migration.create_table(:usergroups) { |t| t.string :name }
|
663
|
+
ActiveRecord::Migration.create_table(:usergroup_members) { |t| t.integer :usergroup_id; t.integer :member_id; t.string :member_type }
|
664
|
+
ActiveRecord::Migration.create_table(:usermats) { |t| t.string :username }
|
665
|
+
ActiveRecord::Migration.create_table(:cached_usergroup_members) { |t| t.integer :usergroup_id; t.integer :usermat_id }
|
666
|
+
|
667
|
+
class Usergroup < ActiveRecord::Base
|
668
|
+
has_many :usergroup_members
|
669
|
+
has_many :usermats, :through => :usergroup_members, :source => :member, :source_type => 'Usermat'
|
670
|
+
has_many :usergroups, :through => :usergroup_members, :source => :member, :source_type => 'Usergroup'
|
671
|
+
|
672
|
+
has_many :cached_usergroup_members
|
673
|
+
has_many :cached_usergroups, :through => :cached_usergroup_members, :source => :usergroup
|
674
|
+
has_many :cached_usergroup_members, :foreign_key => 'usergroup_id'
|
675
|
+
end
|
676
|
+
|
677
|
+
class UsergroupMember < ActiveRecord::Base
|
678
|
+
belongs_to :member, :polymorphic => true
|
679
|
+
belongs_to :usergroup
|
680
|
+
end
|
681
|
+
|
682
|
+
class Usermat < ActiveRecord::Base
|
683
|
+
has_many :usergroup_member, :as => :member
|
684
|
+
has_many :cached_usergroup_members
|
685
|
+
has_many :cached_usergroups, :through => :cached_usergroup_members, :source => :usergroup
|
686
|
+
|
687
|
+
scoped_search :relation => :cached_usergroups, :on => :name, :rename => :usergroup_name
|
688
|
+
end
|
689
|
+
|
690
|
+
class CachedUsergroupMember < ActiveRecord::Base
|
691
|
+
belongs_to :usermat
|
692
|
+
belongs_to :usergroup
|
693
|
+
end
|
694
|
+
|
695
|
+
@group_1 = Usergroup.create!(:name => 'first')
|
696
|
+
@group_2 = Usergroup.create!(:name => 'second')
|
697
|
+
@group_3 = Usergroup.create!(:name => 'third')
|
698
|
+
@group_4 = Usergroup.create!(:name => 'fourth')
|
699
|
+
|
700
|
+
@usermat_1 = Usermat.create(:username => 'user A')
|
701
|
+
@usermat_2 = Usermat.create(:username => 'user B')
|
702
|
+
|
703
|
+
UsergroupMember.create!(:usergroup_id => @group_2.id, :member_id => @group_3.id, :member_type => 'Usergroup')
|
704
|
+
UsergroupMember.create!(:usergroup_id => @group_1.id, :member_id => @usermat_2, :member_type => 'Usermat')
|
705
|
+
UsergroupMember.create!(:usergroup_id => @group_4.id, :member_id => @usermat_1, :member_type => 'Usermat')
|
706
|
+
|
707
|
+
CachedUsergroupMember.create!(:usergroup_id => @group_1.id, :usermat_id => @usermat_1.id)
|
708
|
+
end
|
709
|
+
|
710
|
+
after do
|
711
|
+
ActiveRecord::Migration.drop_table :usergroups
|
712
|
+
ActiveRecord::Migration.drop_table :usergroup_members
|
713
|
+
ActiveRecord::Migration.drop_table :usermats
|
714
|
+
ActiveRecord::Migration.drop_table :cached_usergroup_members
|
715
|
+
end
|
716
|
+
|
717
|
+
it "should find the usermat when searching on usergroup" do
|
718
|
+
result = Usermat.search_for("usergroup_name = #{@group_1.name}")
|
719
|
+
result.length.should == 1
|
720
|
+
result.first.username.should == @usermat_1.username
|
721
|
+
end
|
722
|
+
end
|
638
723
|
end
|
639
724
|
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: 4.1.
|
4
|
+
version: 4.1.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: 2017-09-
|
13
|
+
date: 2017-09-07 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|