scoped_search 2.2.0 → 2.2.1

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.
data/README.rdoc CHANGED
@@ -10,24 +10,6 @@ and build a query based on the search string they enter. If you want to build a
10
10
  more complex search form with multiple fields, searchlogic (see
11
11
  http://github.com/binarylogic/searchlogic) may be a good choice for you.
12
12
 
13
- === Usage
14
-
15
- If you include a :profile parameter in scoped_search, the fields specified will only
16
- be search when you pass :profile into the search_for command:
17
-
18
- class User < ActiveRecord::Base
19
- scoped_search :on => :public_information
20
- scoped_search :on => :private_information, :profile => :members
21
- end
22
-
23
- This will only search the :public_information column:
24
-
25
- User.search_for('blah blah blah')
26
-
27
- And this will only search the :private_information column:
28
-
29
- User.search_for('blah blah blah', :profile => :members)
30
-
31
13
  == Installing
32
14
 
33
15
  The recommended method to enable scoped search in your project is adding the
@@ -54,7 +36,7 @@ Scoped search requires you to define the fields you want to search in:
54
36
 
55
37
  For more information about options and using fields from relations, see the
56
38
  project wiki on search definitions:
57
- http://wiki.github.com/wvanbergen/scoped_search/search-definition
39
+ http://github.com/wvanbergen/scoped_search/wiki/search-definition
58
40
 
59
41
  Now, the <b>search_for</b> scope is available for queries. You should pass a
60
42
  query string to the scope. This can be empty or nil, in which case all no search
@@ -73,8 +55,28 @@ actually chain the call with other scopes, or with will_paginate. An example:
73
55
  # using chained named_scopes and will_paginate in your controller
74
56
  Project.public.search_for(params[:q]).paginate(:page => params[:page], :include => :tasks)
75
57
 
58
+ === Search profiles
59
+
60
+ If you include a :profile option to the scoped_searchcall, the fields specified will only
61
+ be searched when you include this :profile into the search_for command as well:
62
+
63
+ class User < ActiveRecord::Base
64
+ scoped_search :on => :public_information
65
+ scoped_search :on => :private_information, :profile => :members
66
+ end
67
+
68
+ This will only search the :public_information column:
69
+
70
+ User.search_for('blah blah blah')
71
+
72
+ And this will only search the :private_information column:
73
+
74
+ User.search_for('blah blah blah', :profile => :members)
75
+
76
+ === More information
77
+
76
78
  More information about usage can be found in the project wiki:
77
- http://wiki.github.com/wvanbergen/scoped_search/usage
79
+ http://github.com/wvanbergen/scoped_search/wiki/usage
78
80
 
79
81
  == Query language
80
82
 
@@ -108,12 +110,13 @@ nickname:
108
110
 
109
111
  ("Ruby" OR "Rails") -cobol, age >= 18, updated_at > 2009-01-01 && nickname !~ l33t
110
112
 
111
- For more info, see the the project wiki: http://wiki.github.com/wvanbergen/scoped_search/query-language
113
+ For more info, see the the project wiki: http://github.com/wvanbergen/scoped_search/wiki/query-language
112
114
 
113
115
  == Additional resources
114
116
 
115
117
  * Source code: http://github.com/wvanbergen/scoped_search/tree
116
- * Project wiki: http://wiki.github.com/wvanbergen/scoped_search
118
+ * Project wiki: http://github.com/wvanbergen/scoped_search/wiki
119
+ * Issue tracker: http://github.com/wvanbergen/scoped_search/issues
117
120
  * RDoc documentation: http://rdoc.info/projects/wvanbergen/scoped_search
118
121
  * wvanbergen's blog posts: http://techblog.floorplanner.com/tag/scoped_search
119
122
 
data/lib/scoped_search.rb CHANGED
@@ -12,7 +12,7 @@ module ScopedSearch
12
12
 
13
13
  # The current scoped_search version. Do not change thisvalue by hand,
14
14
  # because it will be updated automatically by the gem release script.
15
- VERSION = "2.2.0"
15
+ VERSION = "2.2.1"
16
16
 
17
17
  # The ClassMethods module will be included into the ActiveRecord::Base class
18
18
  # to add the <tt>ActiveRecord::Base.scoped_search</tt> method and the
@@ -18,6 +18,7 @@ module ScopedSearch::QueryLanguage::Parser
18
18
  # Start the parsing process by parsing an expression sequence
19
19
  def parse
20
20
  @tokens = tokenize
21
+ @tokens.delete_at(@tokens.size - 1) if @tokens.last.is_a?(Symbol)
21
22
  parse_expression_sequence(true).simplify
22
23
  end
23
24
 
@@ -3,30 +3,35 @@ Gem::Specification.new do |s|
3
3
 
4
4
  # Do not change the version and date fields by hand. This will be done
5
5
  # automatically by the gem release script.
6
- s.version = "2.2.0"
7
- s.date = "2010-05-26"
6
+ s.version = "2.2.1"
7
+ s.date = "2010-11-09"
8
8
 
9
9
  s.summary = "Easily search you ActiveRecord models with a simple query language using a named scope."
10
10
  s.description = <<-EOS
11
11
  Scoped search makes it easy to search your ActiveRecord-based models.
12
+
12
13
  It will create a named scope :search_for that can be called with a query string. It will build an SQL query using
13
14
  the provided query string and a definition that specifies on what fields to search. Because the functionality is
14
15
  built on named_scope, the result of the search_for call can be used like any other named_scope, so it can be
15
- chained with another scope or combined with will_paginate."
16
+ chained with another scope or combined with will_paginate.
17
+
18
+ Because it uses standard SQL, it does not require any setup, indexers or daemons. This makes scoped_search
19
+ suitable to quickly add basic search functionality to your application with little hassle. On the other hand,
20
+ it may not be the best choice if it is going to be used on very large datasets or by a large user base.
16
21
  EOS
17
22
 
18
23
  s.authors = ['Willem van Bergen', 'Wes Hays']
19
24
  s.email = ['willem@railsdoctors.com', 'weshays@gbdev.com']
20
- s.homepage = 'http://wiki.github.com/wvanbergen/scoped_search'
25
+ s.homepage = 'http://github.com/wvanbergen/scoped_search/wiki'
21
26
 
22
27
  s.add_runtime_dependency('activerecord', '>= 2.1.0')
23
- s.add_development_dependency('rspec', '>= 1.1.4')
28
+ s.add_development_dependency('rspec', '~> 2.0')
24
29
 
25
30
  s.rdoc_options << '--title' << s.name << '--main' << 'README.rdoc' << '--line-numbers' << '--inline-source'
26
31
  s.extra_rdoc_files = ['README.rdoc']
27
32
 
28
33
  # Do not change the files and test_files fields by hand. This will be done
29
34
  # automatically by the gem release script.
30
- s.files = %w(spec/spec_helper.rb spec/integration/string_querying_spec.rb lib/scoped_search/definition.rb spec/lib/mocks.rb scoped_search.gemspec lib/scoped_search/query_language/parser.rb spec/lib/matchers.rb .gitignore LICENSE spec/unit/ast_spec.rb spec/database.yml init.rb Rakefile spec/unit/tokenizer_spec.rb spec/unit/parser_spec.rb spec/integration/api_spec.rb lib/scoped_search/query_language/ast.rb lib/scoped_search/query_language.rb lib/scoped_search/query_builder.rb README.rdoc spec/unit/definition_spec.rb spec/lib/database.rb spec/integration/profile_querying_spec.rb tasks/github-gem.rake spec/unit/query_builder_spec.rb lib/scoped_search.rb spec/integration/relation_querying_spec.rb spec/integration/ordinal_querying_spec.rb lib/scoped_search/query_language/tokenizer.rb)
31
- s.test_files = %w(spec/integration/string_querying_spec.rb spec/unit/ast_spec.rb spec/unit/tokenizer_spec.rb spec/unit/parser_spec.rb spec/integration/api_spec.rb spec/unit/definition_spec.rb spec/integration/profile_querying_spec.rb spec/unit/query_builder_spec.rb spec/integration/relation_querying_spec.rb spec/integration/ordinal_querying_spec.rb)
35
+ s.files = %w(.gitignore LICENSE README.rdoc Rakefile init.rb lib/scoped_search.rb lib/scoped_search/definition.rb lib/scoped_search/query_builder.rb lib/scoped_search/query_language.rb lib/scoped_search/query_language/ast.rb lib/scoped_search/query_language/parser.rb lib/scoped_search/query_language/tokenizer.rb scoped_search.gemspec spec/database.yml spec/integration/api_spec.rb spec/integration/ordinal_querying_spec.rb spec/integration/profile_querying_spec.rb spec/integration/relation_querying_spec.rb spec/integration/string_querying_spec.rb spec/lib/database.rb spec/lib/matchers.rb spec/lib/mocks.rb spec/spec_helper.rb spec/unit/ast_spec.rb spec/unit/definition_spec.rb spec/unit/parser_spec.rb spec/unit/query_builder_spec.rb spec/unit/tokenizer_spec.rb tasks/github-gem.rake)
36
+ s.test_files = %w(spec/integration/api_spec.rb spec/integration/ordinal_querying_spec.rb spec/integration/profile_querying_spec.rb spec/integration/relation_querying_spec.rb spec/integration/string_querying_spec.rb spec/unit/ast_spec.rb spec/unit/definition_spec.rb spec/unit/parser_spec.rb spec/unit/query_builder_spec.rb spec/unit/tokenizer_spec.rb)
32
37
  end
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  describe ScopedSearch, "API" do
4
4
 
@@ -14,11 +14,11 @@ describe ScopedSearch, "API" do
14
14
  # be changed for new major releases.
15
15
 
16
16
  before(:all) do
17
- ScopedSearch::Spec::Database.establish_connection
17
+ ScopedSearch::RSpec::Database.establish_connection
18
18
  end
19
19
 
20
20
  after(:all) do
21
- ScopedSearch::Spec::Database.close_connection
21
+ ScopedSearch::RSpec::Database.close_connection
22
22
  end
23
23
 
24
24
  context 'for unprepared ActiveRecord model' do
@@ -31,13 +31,13 @@ describe ScopedSearch, "API" do
31
31
  context 'for a prepared ActiveRecord model' do
32
32
 
33
33
  before(:all) do
34
- @class = ScopedSearch::Spec::Database.create_model(:field => :string) do |klass|
34
+ @class = ScopedSearch::RSpec::Database.create_model(:field => :string) do |klass|
35
35
  klass.scoped_search :on => :field
36
36
  end
37
37
  end
38
38
 
39
39
  after(:all) do
40
- ScopedSearch::Spec::Database.drop_model(@class)
40
+ ScopedSearch::RSpec::Database.drop_model(@class)
41
41
  end
42
42
 
43
43
  it "should respond to :search_for to perform searches" do
@@ -62,7 +62,7 @@ describe ScopedSearch, "API" do
62
62
  context 'having backwards compatibility' do
63
63
 
64
64
  before(:each) do
65
- class Foo < ActiveRecord::Base
65
+ class ::Foo < ActiveRecord::Base
66
66
  belongs_to :bar
67
67
  end
68
68
  end
@@ -1,23 +1,23 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  # These specs will run on all databases that are defined in the spec/database.yml file.
4
4
  # Comment out any databases that you do not have available for testing purposes if needed.
5
- ScopedSearch::Spec::Database.test_databases.each do |db|
5
+ ScopedSearch::RSpec::Database.test_databases.each do |db|
6
6
 
7
7
  describe ScopedSearch, "using a #{db} database" do
8
8
 
9
9
  before(:all) do
10
- ScopedSearch::Spec::Database.establish_named_connection(db)
10
+ ScopedSearch::RSpec::Database.establish_named_connection(db)
11
11
 
12
- @class = ScopedSearch::Spec::Database.create_model(:int => :integer, :timestamp => :datetime, :date => :date, :unindexed => :integer) do |klass|
12
+ @class = ScopedSearch::RSpec::Database.create_model(:int => :integer, :timestamp => :datetime, :date => :date, :unindexed => :integer) do |klass|
13
13
  klass.scoped_search :on => [:int, :timestamp]
14
14
  klass.scoped_search :on => :date, :only_explicit => true
15
15
  end
16
16
  end
17
17
 
18
18
  after(:all) do
19
- ScopedSearch::Spec::Database.drop_model(@class)
20
- ScopedSearch::Spec::Database.close_connection
19
+ ScopedSearch::RSpec::Database.drop_model(@class)
20
+ ScopedSearch::RSpec::Database.close_connection
21
21
  end
22
22
 
23
23
  context 'quering numerical fields' do
@@ -1,15 +1,15 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  # These specs will run on all databases that are defined in the spec/database.yml file.
4
4
  # Comment out any databases that you do not have available for testing purposes if needed.
5
- ScopedSearch::Spec::Database.test_databases.each do |db|
5
+ ScopedSearch::RSpec::Database.test_databases.each do |db|
6
6
 
7
7
  describe ScopedSearch, "using a #{db} database" do
8
8
 
9
9
  before(:all) do
10
- ScopedSearch::Spec::Database.establish_named_connection(db)
10
+ ScopedSearch::RSpec::Database.establish_named_connection(db)
11
11
 
12
- @class = ScopedSearch::Spec::Database.create_model(:public => :string, :private => :string, :useless => :string) do |klass|
12
+ @class = ScopedSearch::RSpec::Database.create_model(:public => :string, :private => :string, :useless => :string) do |klass|
13
13
  klass.scoped_search :on => :public
14
14
  klass.scoped_search :on => :private, :profile => :private_profile
15
15
  klass.scoped_search :on => :useless, :profile => :another_profile
@@ -21,8 +21,8 @@ ScopedSearch::Spec::Database.test_databases.each do |db|
21
21
  end
22
22
 
23
23
  after(:all) do
24
- ScopedSearch::Spec::Database.drop_model(@class)
25
- ScopedSearch::Spec::Database.close_connection
24
+ ScopedSearch::RSpec::Database.drop_model(@class)
25
+ ScopedSearch::RSpec::Database.close_connection
26
26
  end
27
27
 
28
28
  context "searching without profile specified" do
@@ -1,262 +1,265 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
1
+ require 'spec_helper'
2
2
 
3
- # These specs will run on all databases that are defined in the spec/database.yml file.
4
- # Comment out any databases that you do not have available for testing purposes if needed.
5
- ScopedSearch::Spec::Database.test_databases.each do |db|
3
+ if ActiveRecord::VERSION::MAJOR == 2
4
+ # These specs will run on all databases that are defined in the spec/database.yml file.
5
+ # Comment out any databases that you do not have available for testing purposes if needed.
6
+ ScopedSearch::RSpec::Database.test_databases.each do |db|
6
7
 
7
- describe ScopedSearch, "using a #{db} database" do
8
+ describe ScopedSearch, "using a #{db} database" do
8
9
 
9
- before(:all) do
10
- ScopedSearch::Spec::Database.establish_named_connection(db)
11
- end
10
+ before(:all) do
11
+ ScopedSearch::RSpec::Database.establish_named_connection(db)
12
+ end
12
13
 
13
- after(:all) do
14
- ScopedSearch::Spec::Database.close_connection
15
- end
14
+ after(:all) do
15
+ ScopedSearch::RSpec::Database.close_connection
16
+ end
16
17
 
17
- context 'querying a :belongs_to relation' do
18
+ context 'querying a :belongs_to relation' do
18
19
 
19
- before(:all) do
20
+ before(:all) do
21
+
22
+ # The related class
23
+ ActiveRecord::Migration.create_table(:bars) { |t| t.string :related }
24
+ class ::Bar < ActiveRecord::Base; has_many :foos; end
25
+
26
+ # The class on which to call search_for
27
+ ::Foo = ScopedSearch::Spec::Database.create_model(:foo => :string, :bar_id => :integer) do |klass|
28
+ klass.belongs_to :bar
29
+ klass.scoped_search :in => :bar, :on => :related
30
+ end
20
31
 
21
- # The related class
22
- ActiveRecord::Migration.create_table(:bars) { |t| t.string :related }
23
- class Bar < ActiveRecord::Base; has_many :foos; end
32
+ @bar_record = Bar.create!(:related => 'bar')
24
33
 
25
- # The class on which to call search_for
26
- Foo = ScopedSearch::Spec::Database.create_model(:foo => :string, :bar_id => :integer) do |klass|
27
- klass.belongs_to :bar
28
- klass.scoped_search :in => :bar, :on => :related
34
+ Foo.create!(:foo => 'foo', :bar => @bar_record)
35
+ Foo.create!(:foo => 'foo too', :bar => @bar_record)
36
+ Foo.create!(:foo => 'foo three', :bar => Bar.create!(:related => 'another bar'))
37
+ Foo.create!(:foo => 'foo four')
29
38
  end
30
39
 
31
- @bar_record = Bar.create!(:related => 'bar')
40
+ after(:all) do
41
+ ScopedSearch::RSpec::Database.drop_model(Bar)
42
+ ScopedSearch::RSpec::Database.drop_model(Foo)
43
+ Object.send :remove_const, :Foo
44
+ Object.send :remove_const, :Bar
45
+ end
32
46
 
33
- Foo.create!(:foo => 'foo', :bar => @bar_record)
34
- Foo.create!(:foo => 'foo too', :bar => @bar_record)
35
- Foo.create!(:foo => 'foo three', :bar => Bar.create!(:related => 'another bar'))
36
- Foo.create!(:foo => 'foo four')
37
- end
47
+ it "should find all records with a related bar record containing bar" do
48
+ Foo.search_for('bar').should have(3).items
49
+ end
38
50
 
39
- after(:all) do
40
- ScopedSearch::Spec::Database.drop_model(Bar)
41
- ScopedSearch::Spec::Database.drop_model(Foo)
42
- Object.send :remove_const, :Foo
43
- Object.send :remove_const, :Bar
44
- end
51
+ it "should find all records with a related bar record having an exact value of bar with an explicit field" do
52
+ Foo.search_for('related = bar').should have(2).items
53
+ end
45
54
 
46
- it "should find all records with a related bar record containing bar" do
47
- Foo.search_for('bar').should have(3).items
55
+ it "should find records for which the bar relation is not set using null?" do
56
+ Foo.search_for('null? related').should have(1).items
57
+ end
48
58
  end
49
59
 
50
- it "should find all records with a related bar record having an exact value of bar" do
51
- Foo.search_for('= bar').should have(2).items
52
- end
60
+ context 'querying a :has_many relation' do
53
61
 
54
- it "should find all records with a related bar record having an exact value of bar with an explicit field" do
55
- Foo.search_for('related = bar').should have(2).items
56
- end
62
+ before(:all) do
57
63
 
58
- it "should find records for which the bar relation is not set using null?" do
59
- Foo.search_for('null? related').should have(1).items
60
- end
61
- end
64
+ # The related class
65
+ ActiveRecord::Migration.create_table(:bars) { |t| t.string :related; t.integer :foo_id }
66
+ class ::Bar < ActiveRecord::Base; belongs_to :foo; end
62
67
 
63
- context 'querying a :has_many relation' do
68
+ # The class on which to call search_for
69
+ ::Foo = ScopedSearch::Spec::Database.create_model(:foo => :string, :bar_id => :integer) do |klass|
70
+ klass.has_many :bars
71
+ klass.scoped_search :in => :bars, :on => :related
72
+ end
64
73
 
65
- before(:all) do
74
+ @foo_1 = Foo.create!(:foo => 'foo')
75
+ @foo_2 = Foo.create!(:foo => 'foo too')
76
+ @foo_3 = Foo.create!(:foo => 'foo three')
66
77
 
67
- # The related class
68
- ActiveRecord::Migration.create_table(:bars) { |t| t.string :related; t.integer :foo_id }
69
- class Bar < ActiveRecord::Base; belongs_to :foo; end
78
+ Bar.create!(:related => 'bar', :foo => @foo_1)
79
+ Bar.create!(:related => 'another bar', :foo => @foo_1)
80
+ Bar.create!(:related => 'other bar', :foo => @foo_2)
81
+ end
70
82
 
71
- # The class on which to call search_for
72
- Foo = ScopedSearch::Spec::Database.create_model(:foo => :string, :bar_id => :integer) do |klass|
73
- klass.has_many :bars
74
- klass.scoped_search :in => :bars, :on => :related
83
+ after(:all) do
84
+ ScopedSearch::Spec::Database.drop_model(Bar)
85
+ ScopedSearch::Spec::Database.drop_model(Foo)
86
+ Object.send :remove_const, :Foo
87
+ Object.send :remove_const, :Bar
75
88
  end
76
89
 
77
- @foo_1 = Foo.create!(:foo => 'foo')
78
- @foo_2 = Foo.create!(:foo => 'foo too')
79
- @foo_3 = Foo.create!(:foo => 'foo three')
90
+ it "should find all records with at least one bar record containing 'bar'" do
91
+ Foo.search_for('bar').should have(2).items
92
+ end
80
93
 
81
- Bar.create!(:related => 'bar', :foo => @foo_1)
82
- Bar.create!(:related => 'another bar', :foo => @foo_1)
83
- Bar.create!(:related => 'other bar', :foo => @foo_2)
84
- end
94
+ it "should find the only record with at least one bar record having the exact value 'bar'" do
95
+ Foo.search_for('= bar').should have(1).item
96
+ end
85
97
 
86
- after(:all) do
87
- ScopedSearch::Spec::Database.drop_model(Bar)
88
- ScopedSearch::Spec::Database.drop_model(Foo)
89
- Object.send :remove_const, :Foo
90
- Object.send :remove_const, :Bar
91
- end
98
+ it "should find all records for which at least one related bar record exists" do
99
+ Foo.search_for('set? related').should have(2).items
100
+ end
92
101
 
93
- it "should find all records with at least one bar record containing 'bar'" do
94
- Foo.search_for('bar').should have(2).items
95
- end
102
+ it "should find all records for which none related bar records exist" do
103
+ Foo.search_for('null? related').should have(1).items
104
+ end
96
105
 
97
- it "should find the only record with at least one bar record having the exact value 'bar'" do
98
- Foo.search_for('= bar').should have(1).item
99
106
  end
100
107
 
101
- it "should find all records for which at least one related bar record exists" do
102
- Foo.search_for('set? related').should have(2).items
103
- end
108
+ context 'querying a :has_one relation' do
104
109
 
105
- it "should find all records for which none related bar records exist" do
106
- Foo.search_for('null? related').should have(1).items
107
- end
110
+ before(:all) do
108
111
 
109
- end
112
+ # The related class
113
+ ActiveRecord::Migration.create_table(:bars) { |t| t.string :related; t.integer :foo_id }
114
+ class ::Bar < ActiveRecord::Base; belongs_to :foo; end
110
115
 
111
- context 'querying a :has_one relation' do
116
+ # The class on which to call search_for
117
+ ::Foo = ScopedSearch::Spec::Database.create_model(:foo => :string) do |klass|
118
+ klass.has_one :bar
119
+ klass.scoped_search :in => :bar, :on => :related
120
+ end
112
121
 
113
- before(:all) do
122
+ @foo_1 = ::Foo.create!(:foo => 'foo')
123
+ @foo_2 = ::Foo.create!(:foo => 'foo too')
124
+ @foo_3 = ::Foo.create!(:foo => 'foo three')
114
125
 
115
- # The related class
116
- ActiveRecord::Migration.create_table(:bars) { |t| t.string :related; t.integer :foo_id }
117
- class Bar < ActiveRecord::Base; belongs_to :foo; end
126
+ ::Bar.create!(:related => 'bar', :foo => @foo_1)
127
+ ::Bar.create!(:related => 'other bar', :foo => @foo_2)
128
+ end
118
129
 
119
- # The class on which to call search_for
120
- Foo = ScopedSearch::Spec::Database.create_model(:foo => :string) do |klass|
121
- klass.has_one :bar
122
- klass.scoped_search :in => :bar, :on => :related
130
+ after(:all) do
131
+ ScopedSearch::Spec::Database.drop_model(::Bar)
132
+ ScopedSearch::Spec::Database.drop_model(::Foo)
133
+ Object.send :remove_const, :Foo
134
+ Object.send :remove_const, :Bar
123
135
  end
124
136
 
125
- @foo_1 = Foo.create!(:foo => 'foo')
126
- @foo_2 = Foo.create!(:foo => 'foo too')
127
- @foo_3 = Foo.create!(:foo => 'foo three')
137
+ it "should find all records with a bar record containing 'bar" do
138
+ ::Foo.search_for('bar').should have(2).items
139
+ end
128
140
 
129
- Bar.create!(:related => 'bar', :foo => @foo_1)
130
- Bar.create!(:related => 'other bar', :foo => @foo_2)
131
- end
141
+ it "should find the only record with the bar record has the exact value 'bar" do
142
+ ::Foo.search_for('= bar').should have(1).item
143
+ end
132
144
 
133
- after(:all) do
134
- ScopedSearch::Spec::Database.drop_model(Bar)
135
- ScopedSearch::Spec::Database.drop_model(Foo)
136
- Object.send :remove_const, :Foo
137
- Object.send :remove_const, :Bar
138
- end
145
+ it "should find all records for which the related bar record exists" do
146
+ ::Foo.search_for('set? related').should have(2).items
147
+ end
139
148
 
140
- it "should find all records with a bar record containing 'bar" do
141
- Foo.search_for('bar').should have(2).items
149
+ it "should find all records for which the related bar record does not exist" do
150
+ ::Foo.search_for('null? related').should have(1).items
151
+ end
142
152
  end
143
153
 
144
- it "should find the only record with the bar record has the exact value 'bar" do
145
- Foo.search_for('= bar').should have(1).item
146
- end
154
+ context 'querying a :has_and_belongs_to_many relation' do
147
155
 
148
- it "should find all records for which the related bar record exists" do
149
- Foo.search_for('set? related').should have(2).items
150
- end
156
+ before(:all) do
151
157
 
152
- it "should find all records for which the related bar record does not exist" do
153
- Foo.search_for('null? related').should have(1).items
154
- end
155
- end
158
+ # Create some tables
159
+ ActiveRecord::Migration.create_table(:bars) { |t| t.string :related }
160
+ ActiveRecord::Migration.create_table(:bars_foos, :id => false) { |t| t.integer :foo_id; t.integer :bar_id }
161
+ ActiveRecord::Migration.create_table(:foos) { |t| t.string :foo }
156
162
 
157
- context 'querying a :has_and_belongs_to_many relation' do
163
+ # The related class
164
+ class ::Bar < ActiveRecord::Base; end
158
165
 
159
- before(:all) do
166
+ # The class on which to call search_for
167
+ class ::Foo < ActiveRecord::Base
168
+ has_and_belongs_to_many :bars
169
+ scoped_search :in => :bars, :on => :related
170
+ end
160
171
 
161
- # Create some tables
162
- ActiveRecord::Migration.create_table(:bars) { |t| t.string :related }
163
- ActiveRecord::Migration.create_table(:bars_foos, :id => false) { |t| t.integer :foo_id; t.integer :bar_id }
164
- ActiveRecord::Migration.create_table(:foos) { |t| t.string :foo }
172
+ @foo_1 = ::Foo.create!(:foo => 'foo')
173
+ @foo_2 = ::Foo.create!(:foo => 'foo too')
174
+ @foo_3 = ::Foo.create!(:foo => 'foo three')
165
175
 
166
- # The related class
167
- class Bar < ActiveRecord::Base; end
176
+ @bar_1 = ::Bar.create!(:related => 'bar')
177
+ @bar_2 = ::Bar.create!(:related => 'other bar')
178
+ @bar_3 = ::Bar.create!(:related => 'last bar')
168
179
 
169
- # The class on which to call search_for
170
- class Foo < ActiveRecord::Base
171
- has_and_belongs_to_many :bars
172
- scoped_search :in => :bars, :on => :related
180
+ @foo_1.bars << @bar_1 << @bar_2
181
+ @foo_2.bars << @bar_2 << @bar_3
173
182
  end
174
183
 
175
- @foo_1 = Foo.create!(:foo => 'foo')
176
- @foo_2 = Foo.create!(:foo => 'foo too')
177
- @foo_3 = Foo.create!(:foo => 'foo three')
184
+ after(:all) do
185
+ ActiveRecord::Migration.drop_table(:bars_foos)
186
+ ActiveRecord::Migration.drop_table(:bars)
187
+ ActiveRecord::Migration.drop_table(:foos)
188
+ Object.send :remove_const, :Foo
189
+ Object.send :remove_const, :Bar
190
+ end
178
191
 
179
- @bar_1 = Bar.create!(:related => 'bar')
180
- @bar_2 = Bar.create!(:related => 'other bar')
181
- @bar_3 = Bar.create!(:related => 'last bar')
192
+ it "should find all records with at least one associated bar record containing 'bar'" do
193
+ ::Foo.search_for('bar').should have(2).items
194
+ end
182
195
 
183
- @foo_1.bars << @bar_1 << @bar_2
184
- @foo_2.bars << @bar_2 << @bar_3
185
- end
196
+ it "should find record which is related to @bar_1" do
197
+ ::Foo.search_for('= bar').should have(1).items
198
+ end
186
199
 
187
- after(:all) do
188
- ActiveRecord::Migration.drop_table(:bars_foos)
189
- ActiveRecord::Migration.drop_table(:bars)
190
- ActiveRecord::Migration.drop_table(:foos)
191
- Object.send :remove_const, :Foo
192
- Object.send :remove_const, :Bar
193
- end
200
+ it "should find the only record related to @bar_3" do
201
+ ::Foo.search_for('last').should have(1).items
202
+ end
194
203
 
195
- it "should find all records with at least one associated bar record containing 'bar'" do
196
- Foo.search_for('bar').should have(2).items
204
+ it "should find all records that are related to @bar_2" do
205
+ ::Foo.search_for('other').should have(2).items
206
+ end
197
207
  end
198
208
 
199
- it "should find record which is related to @bar_1" do
200
- Foo.search_for('= bar').should have(1).items
201
- end
209
+ context 'querying a :has_many => :through relation' do
202
210
 
203
- it "should find the only record related to @bar_3" do
204
- Foo.search_for('last').should have(1).items
205
- end
211
+ before(:all) do
206
212
 
207
- it "should find all records that are related to @bar_2" do
208
- Foo.search_for('other').should have(2).items
209
- end
210
- end
213
+ # Create some tables
214
+ ActiveRecord::Migration.create_table(:bars) { |t| t.integer :foo_id; t.integer :baz_id }
215
+ ActiveRecord::Migration.create_table(:bazs) { |t| t.string :related }
216
+ ActiveRecord::Migration.create_table(:foos) { |t| t.string :foo }
211
217
 
212
- context 'querying a :has_many => :through relation' do
218
+ # The related classes
219
+ class ::Bar < ActiveRecord::Base; belongs_to :baz; belongs_to :foo; end
220
+ class ::Baz < ActiveRecord::Base; has_many :bars; end
213
221
 
214
- before(:all) do
222
+ # The class on which to call search_for
223
+ class ::Foo < ActiveRecord::Base
224
+ has_many :bars
225
+ has_many :bazs, :through => :bars
215
226
 
216
- # Create some tables
217
- ActiveRecord::Migration.create_table(:bars) { |t| t.integer :foo_id; t.integer :baz_id }
218
- ActiveRecord::Migration.create_table(:bazs) { |t| t.string :related }
219
- ActiveRecord::Migration.create_table(:foos) { |t| t.string :foo }
227
+ scoped_search :in => :bazs, :on => :related
228
+ end
220
229
 
221
- # The related classes
222
- class Bar < ActiveRecord::Base; belongs_to :baz; belongs_to :foo; end
223
- class Baz < ActiveRecord::Base; has_many :bars; end
230
+ @foo_1 = ::Foo.create!(:foo => 'foo')
231
+ @foo_2 = ::Foo.create!(:foo => 'foo too')
232
+ @foo_3 = ::Foo.create!(:foo => 'foo three')
224
233
 
225
- # The class on which to call search_for
226
- class Foo < ActiveRecord::Base
227
- has_many :bars
228
- has_many :bazs, :through => :bars
234
+ @baz_1 = ::Baz.create(:related => 'baz')
235
+ @baz_2 = ::Baz.create(:related => 'baz too!')
229
236
 
230
- scoped_search :in => :bazs, :on => :related
237
+ @bar_1 = ::Bar.create!(:foo => @foo_1, :baz => @baz_1)
238
+ @bar_2 = ::Bar.create!(:foo => @foo_1)
239
+ @bar_3 = ::Bar.create!(:foo => @foo_2, :baz => @baz_1)
240
+ @bar_3 = ::Bar.create!(:foo => @foo_2, :baz => @baz_2)
241
+ @bar_3 = ::Bar.create!(:foo => @foo_2, :baz => @baz_2)
242
+ @bar_4 = ::Bar.create!(:foo => @foo_3)
231
243
  end
232
244
 
233
- @foo_1 = Foo.create!(:foo => 'foo')
234
- @foo_2 = Foo.create!(:foo => 'foo too')
235
- @foo_3 = Foo.create!(:foo => 'foo three')
236
-
237
- @baz_1 = Baz.create(:related => 'baz')
238
- @baz_2 = Baz.create(:related => 'baz too!')
239
-
240
- @bar_1 = Bar.create!(:foo => @foo_1, :baz => @baz_1)
241
- @bar_2 = Bar.create!(:foo => @foo_1)
242
- @bar_3 = Bar.create!(:foo => @foo_2, :baz => @baz_1)
243
- @bar_3 = Bar.create!(:foo => @foo_2, :baz => @baz_2)
244
- @bar_3 = Bar.create!(:foo => @foo_2, :baz => @baz_2)
245
- @bar_4 = Bar.create!(:foo => @foo_3)
246
- end
247
-
248
- after(:all) do
249
- ActiveRecord::Migration.drop_table(:bazs)
250
- ActiveRecord::Migration.drop_table(:bars)
251
- ActiveRecord::Migration.drop_table(:foos)
252
- Object.send :remove_const, :Foo
253
- Object.send :remove_const, :Bar
254
- Object.send :remove_const, :Baz
255
- end
245
+ after(:all) do
246
+ ActiveRecord::Migration.drop_table(:bazs)
247
+ ActiveRecord::Migration.drop_table(:bars)
248
+ ActiveRecord::Migration.drop_table(:foos)
249
+ Object.send :remove_const, :Foo
250
+ Object.send :remove_const, :Bar
251
+ Object.send :remove_const, :Baz
252
+ end
256
253
 
257
- it "should find the two records that are related to a baz record" do
258
- Foo.search_for('baz').should have(2).items
254
+ it "should find the two records that are related to a baz record" do
255
+ ::Foo.search_for('baz').should have(2).items
256
+ end
259
257
  end
260
258
  end
261
259
  end
260
+ else
261
+ puts
262
+ puts "WARNING:"
263
+ puts "Currently, relationships querying is only 100% supported on Rails 2.x. Use at your own risk when using Rails 3."
264
+ puts
262
265
  end