searchlogic 2.4.32 → 2.5.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/.ruby-version +1 -0
- data/Appraisals +6 -0
- data/Gemfile +2 -10
- data/Gemfile.lock +29 -29
- data/README.rdoc +2 -0
- data/Rakefile +4 -21
- data/gemfiles/ar2.3.10.gemfile +7 -0
- data/gemfiles/ar2.3.10.gemfile.lock +28 -0
- data/gemfiles/ar2.3.11.gemfile +7 -0
- data/gemfiles/ar2.3.11.gemfile.lock +28 -0
- data/gemfiles/ar2.3.12.gemfile +7 -0
- data/gemfiles/ar2.3.12.gemfile.lock +28 -0
- data/gemfiles/ar2.3.14.gemfile +7 -0
- data/gemfiles/ar2.3.14.gemfile.lock +28 -0
- data/gemfiles/ar2.3.9.gemfile +7 -0
- data/gemfiles/ar2.3.9.gemfile.lock +28 -0
- data/lib/searchlogic/active_record/consistency.rb +4 -4
- data/lib/searchlogic/active_record/named_scope_tools.rb +7 -7
- data/lib/searchlogic/active_record/scope.rb +30 -0
- data/lib/searchlogic/core_ext/proc.rb +1 -1
- data/lib/searchlogic/named_scopes/alias_scope.rb +15 -14
- data/lib/searchlogic/named_scopes/association_conditions.rb +16 -16
- data/lib/searchlogic/named_scopes/association_ordering.rb +8 -9
- data/lib/searchlogic/named_scopes/base.rb +16 -0
- data/lib/searchlogic/named_scopes/{conditions.rb → column_conditions.rb} +47 -28
- data/lib/searchlogic/named_scopes/or_conditions.rb +65 -37
- data/lib/searchlogic/named_scopes/ordering.rb +9 -10
- data/lib/searchlogic/rails_helpers.rb +5 -1
- data/lib/searchlogic/search/conditions.rb +4 -4
- data/lib/searchlogic/search/method_missing.rb +7 -12
- data/lib/searchlogic/search/ordering.rb +5 -1
- data/lib/searchlogic/search/to_yaml.rb +2 -2
- data/lib/searchlogic/version.rb +3 -0
- data/lib/searchlogic.rb +9 -9
- data/searchlogic.gemspec +21 -92
- data/spec/searchlogic/active_record/association_proxy_spec.rb +1 -1
- data/spec/searchlogic/active_record/consistency_spec.rb +1 -1
- data/spec/searchlogic/core_ext/object_spec.rb +1 -1
- data/spec/searchlogic/core_ext/proc_spec.rb +1 -1
- data/spec/searchlogic/named_scopes/alias_scope_spec.rb +9 -2
- data/spec/searchlogic/named_scopes/association_conditions_spec.rb +34 -1
- data/spec/searchlogic/named_scopes/association_ordering_spec.rb +1 -1
- data/spec/searchlogic/named_scopes/{conditions_spec.rb → column_conditions_spec.rb} +16 -5
- data/spec/searchlogic/named_scopes/or_conditions_spec.rb +33 -15
- data/spec/searchlogic/named_scopes/ordering_spec.rb +4 -10
- data/spec/searchlogic/search_spec.rb +105 -74
- data/spec/spec_helper.rb +10 -12
- metadata +136 -60
- data/VERSION.yml +0 -5
- data/lib/searchlogic/active_record/association_proxy.rb +0 -20
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9f864b236c2dc4226146369b7231f7d83d895e35
|
4
|
+
data.tar.gz: 0b59222c85aa6367414d20842c9845146b21e42c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a7b667cbce3a1ebd1e278a3f1a232a52c208b6d0f21456db2a58006ebe1e4cab8ec01c559b331a9d6210effea033023aa72694fb088dc492d179ebb8deb406be
|
7
|
+
data.tar.gz: 898cc067511831ac102fd3004dd2726466a03fcf5a77ff7cf0be9c2e03f70377d5e7b3823a1cc7a00f705ab2b35951b7a199e17291d254de1c5af70fb578a5e7
|
data/.gitignore
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.1.2
|
data/Appraisals
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,38 +1,38 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
searchlogic (2.5.17)
|
5
|
+
activerecord (~> 2.3.12)
|
6
|
+
activesupport (~> 2.3.12)
|
7
|
+
|
1
8
|
GEM
|
2
|
-
remote:
|
9
|
+
remote: https://rubygems.org/
|
3
10
|
specs:
|
4
|
-
activerecord (2.3.
|
5
|
-
activesupport (= 2.3.
|
6
|
-
activesupport (2.3.
|
7
|
-
|
8
|
-
|
9
|
-
git (1.2.5)
|
10
|
-
jeweler (1.5.2)
|
11
|
-
bundler (~> 1.0.0)
|
12
|
-
git (>= 1.2.5)
|
11
|
+
activerecord (2.3.18)
|
12
|
+
activesupport (= 2.3.18)
|
13
|
+
activesupport (2.3.18)
|
14
|
+
appraisal (0.4.1)
|
15
|
+
bundler
|
13
16
|
rake
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
ruby-debug-base19 (>= 0.11.19)
|
26
|
-
ruby_core_source (0.1.4)
|
27
|
-
archive-tar-minitar (>= 0.5.2)
|
28
|
-
sqlite3 (1.3.3)
|
17
|
+
coderay (1.1.0)
|
18
|
+
method_source (0.8.2)
|
19
|
+
pry (0.9.12.6)
|
20
|
+
coderay (~> 1.0)
|
21
|
+
method_source (~> 0.8)
|
22
|
+
slop (~> 3.4)
|
23
|
+
rake (10.1.1)
|
24
|
+
rspec (1.3.2)
|
25
|
+
slop (3.4.7)
|
26
|
+
sqlite3 (1.3.8)
|
27
|
+
timecop (0.5.9.2)
|
29
28
|
|
30
29
|
PLATFORMS
|
31
30
|
ruby
|
32
31
|
|
33
32
|
DEPENDENCIES
|
34
|
-
|
35
|
-
|
36
|
-
rspec (
|
37
|
-
|
33
|
+
appraisal (= 0.4.1)
|
34
|
+
pry
|
35
|
+
rspec (~> 1.3.1)
|
36
|
+
searchlogic!
|
38
37
|
sqlite3
|
38
|
+
timecop (~> 0.5.9.1)
|
data/README.rdoc
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
Searchlogic makes using ActiveRecord named scopes easier and less repetitive. It helps keep your code DRY, clean, and simple.
|
4
4
|
|
5
|
+
The specs pass with ActiveRecord 2.3.9 - 2.3.14 on Ruby 1.9.3-p125, 1.9.2-p318, and 1.8.7-p358
|
6
|
+
|
5
7
|
== Helpful links
|
6
8
|
|
7
9
|
* <b>Documentation:</b> http://rdoc.info/projects/binarylogic/searchlogic
|
data/Rakefile
CHANGED
@@ -1,26 +1,9 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require 'bundler'
|
4
|
-
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
5
3
|
Bundler.setup
|
6
|
-
|
7
|
-
begin
|
8
|
-
require 'jeweler'
|
9
|
-
Jeweler::Tasks.new do |gem|
|
10
|
-
gem.name = "searchlogic"
|
11
|
-
gem.summary = "Searchlogic makes using ActiveRecord named scopes easier and less repetitive."
|
12
|
-
gem.description = "Searchlogic makes using ActiveRecord named scopes easier and less repetitive."
|
13
|
-
gem.email = "bjohnson@binarylogic.com"
|
14
|
-
gem.homepage = "http://github.com/binarylogic/searchlogic"
|
15
|
-
gem.authors = ["Ben Johnson of Binary Logic"]
|
16
|
-
gem.add_bundler_dependencies
|
17
|
-
end
|
18
|
-
Jeweler::GemcutterTasks.new
|
19
|
-
rescue LoadError
|
20
|
-
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
21
|
-
end
|
22
|
-
|
4
|
+
require 'appraisal'
|
23
5
|
require 'spec/rake/spectask'
|
6
|
+
|
24
7
|
Spec::Rake::SpecTask.new(:spec) do |spec|
|
25
8
|
spec.libs << 'lib' << 'spec'
|
26
9
|
spec.spec_files = FileList['spec/**/*_spec.rb']
|
@@ -0,0 +1,28 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/john/code/searchlogic
|
3
|
+
specs:
|
4
|
+
searchlogic (2.5.8)
|
5
|
+
activerecord (~> 2.3.8)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activerecord (2.3.10)
|
11
|
+
activesupport (= 2.3.10)
|
12
|
+
activesupport (2.3.10)
|
13
|
+
appraisal (0.4.1)
|
14
|
+
bundler
|
15
|
+
rake
|
16
|
+
rake (0.9.2.2)
|
17
|
+
rspec (1.3.2)
|
18
|
+
sqlite3 (1.3.5)
|
19
|
+
|
20
|
+
PLATFORMS
|
21
|
+
ruby
|
22
|
+
|
23
|
+
DEPENDENCIES
|
24
|
+
activerecord (= 2.3.10)
|
25
|
+
appraisal (= 0.4.1)
|
26
|
+
rspec (~> 1.3.1)
|
27
|
+
searchlogic!
|
28
|
+
sqlite3
|
@@ -0,0 +1,28 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/john/code/searchlogic
|
3
|
+
specs:
|
4
|
+
searchlogic (2.5.8)
|
5
|
+
activerecord (~> 2.3.8)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activerecord (2.3.11)
|
11
|
+
activesupport (= 2.3.11)
|
12
|
+
activesupport (2.3.11)
|
13
|
+
appraisal (0.4.1)
|
14
|
+
bundler
|
15
|
+
rake
|
16
|
+
rake (0.9.2.2)
|
17
|
+
rspec (1.3.2)
|
18
|
+
sqlite3 (1.3.5)
|
19
|
+
|
20
|
+
PLATFORMS
|
21
|
+
ruby
|
22
|
+
|
23
|
+
DEPENDENCIES
|
24
|
+
activerecord (= 2.3.11)
|
25
|
+
appraisal (= 0.4.1)
|
26
|
+
rspec (~> 1.3.1)
|
27
|
+
searchlogic!
|
28
|
+
sqlite3
|
@@ -0,0 +1,28 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/john/code/searchlogic
|
3
|
+
specs:
|
4
|
+
searchlogic (2.5.8)
|
5
|
+
activerecord (~> 2.3.8)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activerecord (2.3.12)
|
11
|
+
activesupport (= 2.3.12)
|
12
|
+
activesupport (2.3.12)
|
13
|
+
appraisal (0.4.1)
|
14
|
+
bundler
|
15
|
+
rake
|
16
|
+
rake (0.9.2.2)
|
17
|
+
rspec (1.3.2)
|
18
|
+
sqlite3 (1.3.5)
|
19
|
+
|
20
|
+
PLATFORMS
|
21
|
+
ruby
|
22
|
+
|
23
|
+
DEPENDENCIES
|
24
|
+
activerecord (= 2.3.12)
|
25
|
+
appraisal (= 0.4.1)
|
26
|
+
rspec (~> 1.3.1)
|
27
|
+
searchlogic!
|
28
|
+
sqlite3
|
@@ -0,0 +1,28 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/john/code/searchlogic
|
3
|
+
specs:
|
4
|
+
searchlogic (2.5.8)
|
5
|
+
activerecord (~> 2.3.8)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activerecord (2.3.14)
|
11
|
+
activesupport (= 2.3.14)
|
12
|
+
activesupport (2.3.14)
|
13
|
+
appraisal (0.4.1)
|
14
|
+
bundler
|
15
|
+
rake
|
16
|
+
rake (0.9.2.2)
|
17
|
+
rspec (1.3.2)
|
18
|
+
sqlite3 (1.3.5)
|
19
|
+
|
20
|
+
PLATFORMS
|
21
|
+
ruby
|
22
|
+
|
23
|
+
DEPENDENCIES
|
24
|
+
activerecord (= 2.3.14)
|
25
|
+
appraisal (= 0.4.1)
|
26
|
+
rspec (~> 1.3.1)
|
27
|
+
searchlogic!
|
28
|
+
sqlite3
|
@@ -0,0 +1,28 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/john/code/searchlogic
|
3
|
+
specs:
|
4
|
+
searchlogic (2.5.8)
|
5
|
+
activerecord (~> 2.3.8)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activerecord (2.3.9)
|
11
|
+
activesupport (= 2.3.9)
|
12
|
+
activesupport (2.3.9)
|
13
|
+
appraisal (0.4.1)
|
14
|
+
bundler
|
15
|
+
rake
|
16
|
+
rake (0.9.2.2)
|
17
|
+
rspec (1.3.2)
|
18
|
+
sqlite3 (1.3.5)
|
19
|
+
|
20
|
+
PLATFORMS
|
21
|
+
ruby
|
22
|
+
|
23
|
+
DEPENDENCIES
|
24
|
+
activerecord (= 2.3.9)
|
25
|
+
appraisal (= 0.4.1)
|
26
|
+
rspec (~> 1.3.1)
|
27
|
+
searchlogic!
|
28
|
+
sqlite3
|
@@ -10,7 +10,7 @@ module Searchlogic
|
|
10
10
|
alias_method_chain :merge_joins, :merged_duplicates
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
# In AR multiple joins are sometimes in a single join query, and other times they
|
15
15
|
# are not. The merge_joins method in AR should account for this, but it doesn't.
|
16
16
|
# This fixes that problem. This way there is one join per string, which allows
|
@@ -19,7 +19,7 @@ module Searchlogic
|
|
19
19
|
joins = merge_joins_without_singularity(*args)
|
20
20
|
joins.collect { |j| j.is_a?(String) ? j.split(" ") : j }.flatten.uniq
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
# This method ensures that the order of the conditions in the joins are the same.
|
24
24
|
# The strings of the joins MUST be exactly the same for AR to remove the duplicates.
|
25
25
|
# AR is not consistent in this approach, resulting in duplicate joins errors when
|
@@ -38,8 +38,8 @@ module Searchlogic
|
|
38
38
|
end
|
39
39
|
end.uniq
|
40
40
|
end
|
41
|
-
|
42
|
-
|
41
|
+
|
42
|
+
|
43
43
|
def merge_joins_with_merged_duplicates(*args)
|
44
44
|
args << "" if !Thread.current["searchlogic_delegation"]
|
45
45
|
joins = merge_joins_without_merged_duplicates(*args)
|
@@ -14,14 +14,14 @@ module Searchlogic
|
|
14
14
|
# method.
|
15
15
|
def named_scope_options(name)
|
16
16
|
key = scopes.key?(name.to_sym) ? name.to_sym : condition_scope_name(name)
|
17
|
-
|
18
|
-
if key
|
17
|
+
|
18
|
+
if key && scopes[key]
|
19
19
|
eval("options", scopes[key].binding)
|
20
20
|
else
|
21
21
|
nil
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
# The arity for a named scope's proc is important, because we use the arity
|
26
26
|
# to determine if the condition should be ignored when calling the search method.
|
27
27
|
# If the condition is false and the arity is 0, then we skip it all together. Ex:
|
@@ -37,7 +37,7 @@ module Searchlogic
|
|
37
37
|
options = named_scope_options(name)
|
38
38
|
options.respond_to?(:arity) ? options.arity : nil
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
# When searchlogic calls a named_scope on a foreigh model it will execute that scope and then call scope(:find).
|
42
42
|
# When we get these options we want this to be in an exclusive scope, especially if we are calling a condition on
|
43
43
|
# the same originating model:
|
@@ -58,7 +58,7 @@ module Searchlogic
|
|
58
58
|
with_exclusive_scope(&block)
|
59
59
|
Thread.current["searchlogic_delegation"] = old
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
# A convenience method for creating inner join sql to that your inner joins
|
63
63
|
# are consistent with how Active Record creates them. Basically a tool for
|
64
64
|
# you to use when writing your own named scopes. This way you know for sure
|
@@ -71,7 +71,7 @@ module Searchlogic
|
|
71
71
|
def inner_joins(association_name)
|
72
72
|
::ActiveRecord::Associations::ClassMethods::InnerJoinDependency.new(self, association_name, nil).join_associations.collect { |assoc| assoc.association_join }
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
# A convenience methods to create a join on a polymorphic associations target.
|
76
76
|
# Ex:
|
77
77
|
#
|
@@ -91,7 +91,7 @@ module Searchlogic
|
|
91
91
|
"INNER JOIN #{options[:target_table]} ON #{options[:target_table]}.id = #{options[:on_table_name]}.#{options[:as]}_id AND " +
|
92
92
|
"#{options[:on_table_name]}.#{options[:as]}_type = #{postgres ? "E" : ""}'#{target.to_s.camelize}'"
|
93
93
|
end
|
94
|
-
|
94
|
+
|
95
95
|
# See inner_joins. Does the same thing except creates LEFT OUTER joins.
|
96
96
|
def left_outer_joins(association_name)
|
97
97
|
::ActiveRecord::Associations::ClassMethods::JoinDependency.new(self, association_name, nil).join_associations.collect { |assoc| assoc.association_join }
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module ActiveRecord
|
3
|
+
# The internals to ActiveRecord like to do scopes.include?(scope_name). And this is how they check for the existence
|
4
|
+
# of scopes, which is terrible. The problem is that searchlogic scopes are dynamically created. So the only solution
|
5
|
+
# is to override the include? method for the scopes hash, try to create the named scope, and then check it again.
|
6
|
+
# This shouldn't effect performance because once its created it never gets called again. I also cache failed names
|
7
|
+
# so we don't try to create them again.
|
8
|
+
module Scope
|
9
|
+
def scopes
|
10
|
+
read_inheritable_attribute(:scopes) || write_inheritable_attribute(:scopes, {}.tap do |h|
|
11
|
+
|
12
|
+
class << h
|
13
|
+
attr_accessor :active_record_class
|
14
|
+
end
|
15
|
+
h.active_record_class = self
|
16
|
+
|
17
|
+
h.instance_eval <<-eval
|
18
|
+
def include?(key)
|
19
|
+
result = super
|
20
|
+
return result if result
|
21
|
+
active_record_class.respond_to?(key)
|
22
|
+
super
|
23
|
+
end
|
24
|
+
eval
|
25
|
+
|
26
|
+
end)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -8,7 +8,7 @@ module Searchlogic
|
|
8
8
|
# or represents a named scope procedure. Ex:
|
9
9
|
#
|
10
10
|
# class User
|
11
|
-
# def teenager
|
11
|
+
# def self.teenager
|
12
12
|
# age_gte(13).age_lte(19)
|
13
13
|
# end
|
14
14
|
# end
|
@@ -33,11 +33,11 @@ module Searchlogic
|
|
33
33
|
# is a safe method.
|
34
34
|
def alias_scope(name, options = nil)
|
35
35
|
alias_scopes[name.to_sym] = options
|
36
|
-
(class << self; self end).instance_eval do
|
36
|
+
(class << self; self; end).instance_eval do
|
37
37
|
define_method name do |*args|
|
38
38
|
case options
|
39
39
|
when Symbol
|
40
|
-
send(options)
|
40
|
+
send(options, *args)
|
41
41
|
else
|
42
42
|
options.call(*args)
|
43
43
|
end
|
@@ -45,23 +45,24 @@ module Searchlogic
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
alias_method :scope_procedure, :alias_scope
|
48
|
-
|
49
|
-
def alias_scopes # :nodoc:
|
50
|
-
read_inheritable_attribute(:alias_scopes) || write_inheritable_attribute(:alias_scopes, {})
|
51
|
-
end
|
52
|
-
|
53
|
-
def alias_scope?(name) # :nodoc:
|
54
|
-
return false if name.blank?
|
55
|
-
alias_scopes.key?(name.to_sym)
|
56
|
-
end
|
57
|
-
|
48
|
+
|
58
49
|
def condition?(name) # :nodoc:
|
59
50
|
super || alias_scope?(name)
|
60
51
|
end
|
61
|
-
|
52
|
+
|
62
53
|
def named_scope_options(name) # :nodoc:
|
63
54
|
super || alias_scopes[name.to_sym]
|
64
55
|
end
|
56
|
+
|
57
|
+
private
|
58
|
+
def alias_scopes # :nodoc:
|
59
|
+
read_inheritable_attribute(:alias_scopes) || write_inheritable_attribute(:alias_scopes, {})
|
60
|
+
end
|
61
|
+
|
62
|
+
def alias_scope?(name) # :nodoc:
|
63
|
+
return false if name.blank?
|
64
|
+
alias_scopes.key?(name.to_sym)
|
65
|
+
end
|
65
66
|
end
|
66
67
|
end
|
67
68
|
end
|
@@ -11,12 +11,13 @@ module Searchlogic
|
|
11
11
|
!association_condition_details(name).nil? unless name.to_s.downcase.match("_or_")
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
# We need to try and create other conditions first so that we give priority to conflicting names.
|
15
|
+
# Such as having a column name with the exact same name as an association condition.
|
16
|
+
def create_condition(name)
|
17
|
+
if result = super
|
18
|
+
result
|
19
|
+
elsif details = association_condition_details(name)
|
20
|
+
create_association_condition(details[:association], details[:condition], details[:poly_class])
|
20
21
|
end
|
21
22
|
end
|
22
23
|
|
@@ -31,7 +32,7 @@ module Searchlogic
|
|
31
32
|
poly_type = nil
|
32
33
|
condition = nil
|
33
34
|
|
34
|
-
if name_with_condition.to_s =~ /^(#{non_poly_assocs.collect(&:name).join("|")})_(\w+)$/
|
35
|
+
if name_with_condition.to_s =~ /^(#{non_poly_assocs.collect(&:name).join("|")})_(\w+)$/ && non_poly_assocs.present?
|
35
36
|
association_name = $1
|
36
37
|
condition = $2
|
37
38
|
elsif name_with_condition.to_s =~ /^(#{poly_assocs.collect(&:name).join("|")})_(\w+?)_type_(\w+)$/
|
@@ -51,27 +52,27 @@ module Searchlogic
|
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
54
|
-
def create_association_condition(association, condition_name,
|
55
|
+
def create_association_condition(association, condition_name, poly_class = nil)
|
55
56
|
name = [association.name, poly_class && "#{poly_class.name.underscore}_type", condition_name].compact.join("_")
|
56
|
-
named_scope(name, association_condition_options(association, condition_name,
|
57
|
+
named_scope(name, association_condition_options(association, condition_name, poly_class))
|
57
58
|
end
|
58
59
|
|
59
|
-
def association_condition_options(association, association_condition,
|
60
|
+
def association_condition_options(association, association_condition, poly_class = nil)
|
60
61
|
klass = poly_class ? poly_class : association.klass
|
61
|
-
scope
|
62
|
-
scope_options = klass.named_scope_options(association_condition)
|
62
|
+
raise ArgumentError.new("The #{klass} class does not respond to the #{association_condition} scope") if !klass.respond_to?(association_condition)
|
63
63
|
arity = klass.named_scope_arity(association_condition)
|
64
64
|
|
65
|
-
if !arity
|
65
|
+
if !arity
|
66
66
|
# The underlying condition doesn't require any parameters, so let's just create a simple
|
67
67
|
# named scope that is based on a hash.
|
68
68
|
options = {}
|
69
|
-
in_searchlogic_delegation { options =
|
69
|
+
in_searchlogic_delegation { options = klass.send(association_condition).scope(:find) }
|
70
70
|
prepare_named_scope_options(options, association, poly_class)
|
71
71
|
options
|
72
72
|
else
|
73
|
-
|
73
|
+
scope_options = klass.named_scope_options(association_condition)
|
74
74
|
scope_options = scope_options.respond_to?(:searchlogic_options) ? scope_options.searchlogic_options.clone : {}
|
75
|
+
proc_args = arity_args(arity)
|
75
76
|
arg_type = scope_options.delete(:type) || :string
|
76
77
|
|
77
78
|
eval <<-"end_eval"
|
@@ -83,7 +84,6 @@ module Searchlogic
|
|
83
84
|
options = scope.scope(:find) if scope
|
84
85
|
end
|
85
86
|
|
86
|
-
|
87
87
|
prepare_named_scope_options(options, association, poly_class)
|
88
88
|
options
|
89
89
|
}
|
@@ -13,21 +13,20 @@ module Searchlogic
|
|
13
13
|
def condition?(name) # :nodoc:
|
14
14
|
super || association_ordering_condition?(name)
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
private
|
18
18
|
def association_ordering_condition?(name)
|
19
19
|
!association_ordering_condition_details(name).nil?
|
20
20
|
end
|
21
|
-
|
22
|
-
def
|
21
|
+
|
22
|
+
def create_condition(name)
|
23
23
|
if details = association_ordering_condition_details(name)
|
24
|
-
create_association_ordering_condition(details[:association], details[:order_as], details[:condition]
|
25
|
-
send(name, *args)
|
24
|
+
create_association_ordering_condition(details[:association], details[:order_as], details[:condition])
|
26
25
|
else
|
27
26
|
super
|
28
27
|
end
|
29
28
|
end
|
30
|
-
|
29
|
+
|
31
30
|
def association_ordering_condition_details(name)
|
32
31
|
associations = reflect_on_all_associations
|
33
32
|
association_names = associations.collect { |assoc| assoc.name }
|
@@ -35,8 +34,8 @@ module Searchlogic
|
|
35
34
|
{:order_as => $1, :association => associations.find { |a| a.name == $2.to_sym }, :condition => $3}
|
36
35
|
end
|
37
36
|
end
|
38
|
-
|
39
|
-
def create_association_ordering_condition(association, order_as, condition
|
37
|
+
|
38
|
+
def create_association_ordering_condition(association, order_as, condition)
|
40
39
|
cond = condition
|
41
40
|
poly_class = nil
|
42
41
|
if condition =~ /^(\w+)_type_(\w+)$/
|
@@ -44,7 +43,7 @@ module Searchlogic
|
|
44
43
|
cond = $2
|
45
44
|
poly_class = poly_type.camelcase.constantize if poly_type
|
46
45
|
end
|
47
|
-
named_scope("#{order_as}_by_#{association.name}_#{condition}", association_condition_options(association, "#{order_as}_by_#{cond}",
|
46
|
+
named_scope("#{order_as}_by_#{association.name}_#{condition}", association_condition_options(association, "#{order_as}_by_#{cond}", poly_class))
|
48
47
|
end
|
49
48
|
end
|
50
49
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Searchlogic
|
2
|
+
module NamedScopes
|
3
|
+
module Base
|
4
|
+
def condition?(name)
|
5
|
+
existing_condition?(name)
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
def existing_condition?(name)
|
10
|
+
return false if name.blank?
|
11
|
+
@valid_scope_names ||= scopes.keys.reject { |k| k == :scoped }
|
12
|
+
@valid_scope_names.include?(name.to_sym)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|