searchlogic 2.4.28 → 2.4.29
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/Gemfile +11 -0
- data/Gemfile.lock +38 -0
- data/Rakefile +4 -3
- data/VERSION.yml +1 -1
- data/lib/searchlogic/active_record/association_proxy.rb +3 -2
- data/lib/searchlogic/named_scopes/association_conditions.rb +19 -19
- data/lib/searchlogic/named_scopes/association_ordering.rb +8 -1
- data/lib/searchlogic/named_scopes/conditions.rb +0 -1
- data/searchlogic.gemspec +15 -4
- data/spec/searchlogic/active_record/association_proxy_spec.rb +3 -3
- data/spec/searchlogic/named_scopes/association_conditions_spec.rb +43 -33
- data/spec/searchlogic/named_scopes/association_ordering_spec.rb +13 -6
- data/spec/spec_helper.rb +1 -0
- metadata +42 -4
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
activerecord (2.3.11)
|
5
|
+
activesupport (= 2.3.11)
|
6
|
+
activesupport (2.3.11)
|
7
|
+
archive-tar-minitar (0.5.2)
|
8
|
+
columnize (0.3.2)
|
9
|
+
git (1.2.5)
|
10
|
+
jeweler (1.5.2)
|
11
|
+
bundler (~> 1.0.0)
|
12
|
+
git (>= 1.2.5)
|
13
|
+
rake
|
14
|
+
linecache19 (0.5.11)
|
15
|
+
ruby_core_source (>= 0.1.4)
|
16
|
+
rake (0.8.7)
|
17
|
+
rspec (1.3.1)
|
18
|
+
ruby-debug-base19 (0.11.24)
|
19
|
+
columnize (>= 0.3.1)
|
20
|
+
linecache19 (>= 0.5.11)
|
21
|
+
ruby_core_source (>= 0.1.4)
|
22
|
+
ruby-debug19 (0.11.6)
|
23
|
+
columnize (>= 0.3.1)
|
24
|
+
linecache19 (>= 0.5.11)
|
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)
|
29
|
+
|
30
|
+
PLATFORMS
|
31
|
+
ruby
|
32
|
+
|
33
|
+
DEPENDENCIES
|
34
|
+
activerecord (= 2.3.11)
|
35
|
+
jeweler
|
36
|
+
rspec (= 1.3.1)
|
37
|
+
ruby-debug19
|
38
|
+
sqlite3
|
data/Rakefile
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake'
|
3
|
+
require 'bundler'
|
4
|
+
|
5
|
+
Bundler.setup
|
3
6
|
|
4
7
|
begin
|
5
8
|
require 'jeweler'
|
@@ -10,7 +13,7 @@ begin
|
|
10
13
|
gem.email = "bjohnson@binarylogic.com"
|
11
14
|
gem.homepage = "http://github.com/binarylogic/searchlogic"
|
12
15
|
gem.authors = ["Ben Johnson of Binary Logic"]
|
13
|
-
gem.
|
16
|
+
gem.add_bundler_dependencies
|
14
17
|
end
|
15
18
|
Jeweler::GemcutterTasks.new
|
16
19
|
rescue LoadError
|
@@ -29,6 +32,4 @@ Spec::Rake::SpecTask.new(:rcov) do |spec|
|
|
29
32
|
spec.rcov = true
|
30
33
|
end
|
31
34
|
|
32
|
-
task :spec => :check_dependencies
|
33
|
-
|
34
35
|
task :default => :spec
|
data/VERSION.yml
CHANGED
@@ -8,11 +8,12 @@ module Searchlogic
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def send_with_searchlogic(method, *args)
|
11
|
+
# create the scope if it doesn't exist yet, then delegate back to the original method
|
11
12
|
if !proxy_respond_to?(method) && proxy_reflection.macro != :belongs_to && !proxy_reflection.options[:polymorphic] && proxy_reflection.klass.condition?(method)
|
12
13
|
proxy_reflection.klass.send(method, *args)
|
13
|
-
else
|
14
|
-
send_without_searchlogic(method, *args)
|
15
14
|
end
|
15
|
+
|
16
|
+
send_without_searchlogic(method, *args)
|
16
17
|
end
|
17
18
|
end
|
18
19
|
end
|
@@ -5,12 +5,12 @@ module Searchlogic
|
|
5
5
|
def condition?(name) # :nodoc:
|
6
6
|
super || association_condition?(name)
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
private
|
10
10
|
def association_condition?(name)
|
11
11
|
!association_condition_details(name).nil? unless name.to_s.downcase.match("_or_")
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def method_missing(name, *args, &block)
|
15
15
|
if !local_condition?(name) && details = association_condition_details(name)
|
16
16
|
create_association_condition(details[:association], details[:condition], args, details[:poly_class])
|
@@ -19,18 +19,18 @@ module Searchlogic
|
|
19
19
|
super
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def association_condition_details(name, last_condition = nil)
|
24
24
|
non_poly_assocs = reflect_on_all_associations.reject { |assoc| assoc.options[:polymorphic] }.sort { |a, b| b.name.to_s.size <=> a.name.to_s.size }
|
25
25
|
poly_assocs = reflect_on_all_associations.reject { |assoc| !assoc.options[:polymorphic] }.sort { |a, b| b.name.to_s.size <=> a.name.to_s.size }
|
26
26
|
return nil if non_poly_assocs.empty? && poly_assocs.empty?
|
27
|
-
|
27
|
+
|
28
28
|
name_with_condition = [name, last_condition].compact.join('_')
|
29
|
-
|
29
|
+
|
30
30
|
association_name = nil
|
31
31
|
poly_type = nil
|
32
32
|
condition = nil
|
33
|
-
|
33
|
+
|
34
34
|
if name_with_condition.to_s =~ /^(#{non_poly_assocs.collect(&:name).join("|")})_(\w+)$/
|
35
35
|
association_name = $1
|
36
36
|
condition = $2
|
@@ -39,7 +39,7 @@ module Searchlogic
|
|
39
39
|
poly_type = $2
|
40
40
|
condition = $3
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
if association_name && condition
|
44
44
|
association = reflect_on_association(association_name.to_sym)
|
45
45
|
klass = poly_type ? poly_type.camelcase.constantize : association.klass
|
@@ -50,18 +50,18 @@ module Searchlogic
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
def create_association_condition(association, condition_name, args, poly_class = nil)
|
55
55
|
name = [association.name, poly_class && "#{poly_class.name.underscore}_type", condition_name].compact.join("_")
|
56
56
|
named_scope(name, association_condition_options(association, condition_name, args, poly_class))
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
def association_condition_options(association, association_condition, args, poly_class = nil)
|
60
60
|
klass = poly_class ? poly_class : association.klass
|
61
61
|
scope = klass.send(association_condition, *args)
|
62
62
|
scope_options = klass.named_scope_options(association_condition)
|
63
63
|
arity = klass.named_scope_arity(association_condition)
|
64
|
-
|
64
|
+
|
65
65
|
if !arity || arity == 0
|
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.
|
@@ -73,24 +73,24 @@ module Searchlogic
|
|
73
73
|
proc_args = arity_args(arity)
|
74
74
|
scope_options = scope_options.respond_to?(:searchlogic_options) ? scope_options.searchlogic_options.clone : {}
|
75
75
|
arg_type = scope_options.delete(:type) || :string
|
76
|
-
|
76
|
+
|
77
77
|
eval <<-"end_eval"
|
78
78
|
searchlogic_lambda(:#{arg_type}, #{scope_options.inspect}) { |#{proc_args.join(",")}|
|
79
79
|
options = {}
|
80
|
-
|
80
|
+
|
81
81
|
in_searchlogic_delegation do
|
82
82
|
scope = klass.send(association_condition, #{proc_args.join(",")})
|
83
83
|
options = scope.scope(:find) if scope
|
84
84
|
end
|
85
|
-
|
86
|
-
|
85
|
+
|
86
|
+
|
87
87
|
prepare_named_scope_options(options, association, poly_class)
|
88
88
|
options
|
89
89
|
}
|
90
90
|
end_eval
|
91
91
|
end
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
# Used to match the new scopes parameters to the underlying scope. This way we can disguise the
|
95
95
|
# new scope as best as possible instead of taking the easy way out and using *args.
|
96
96
|
def arity_args(arity)
|
@@ -109,16 +109,16 @@ module Searchlogic
|
|
109
109
|
end
|
110
110
|
args
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
def prepare_named_scope_options(options, association, poly_class = nil)
|
114
114
|
options.delete(:readonly) # AR likes to set :readonly to true when using the :joins option, we don't want that
|
115
|
-
|
115
|
+
|
116
116
|
klass = poly_class || association.klass
|
117
117
|
# sanitize the conditions locally so we get the right table name, otherwise the conditions will be evaluated on the original model
|
118
118
|
options[:conditions] = klass.sanitize_sql_for_conditions(options[:conditions]) if options[:conditions].is_a?(Hash)
|
119
|
-
|
119
|
+
|
120
120
|
poly_join = poly_class && inner_polymorphic_join(poly_class.name.underscore, :as => association.name)
|
121
|
-
|
121
|
+
|
122
122
|
if options[:joins].is_a?(String) || array_of_strings?(options[:joins])
|
123
123
|
options[:joins] = [poly_class ? poly_join : inner_joins(association.name), options[:joins]].flatten
|
124
124
|
elsif poly_class
|
@@ -37,7 +37,14 @@ module Searchlogic
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def create_association_ordering_condition(association, order_as, condition, args)
|
40
|
-
|
40
|
+
cond = condition
|
41
|
+
poly_class = nil
|
42
|
+
if condition =~ /^(\w+)_type_(\w+)$/
|
43
|
+
poly_type = $1
|
44
|
+
cond = $2
|
45
|
+
poly_class = poly_type.camelcase.constantize if poly_type
|
46
|
+
end
|
47
|
+
named_scope("#{order_as}_by_#{association.name}_#{condition}", association_condition_options(association, "#{order_as}_by_#{cond}", args, poly_class))
|
41
48
|
end
|
42
49
|
end
|
43
50
|
end
|
data/searchlogic.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{searchlogic}
|
8
|
-
s.version = "2.4.
|
8
|
+
s.version = "2.4.29"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ben Johnson of Binary Logic"]
|
@@ -17,6 +17,8 @@ Gem::Specification.new do |s|
|
|
17
17
|
"README.rdoc"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
|
+
"Gemfile",
|
21
|
+
"Gemfile.lock",
|
20
22
|
"LICENSE",
|
21
23
|
"README.rdoc",
|
22
24
|
"Rakefile",
|
@@ -83,12 +85,21 @@ Gem::Specification.new do |s|
|
|
83
85
|
s.specification_version = 3
|
84
86
|
|
85
87
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
86
|
-
s.add_runtime_dependency(%q<
|
88
|
+
s.add_runtime_dependency(%q<jeweler>, [">= 0"])
|
89
|
+
s.add_runtime_dependency(%q<activerecord>, ["= 2.3.11"])
|
90
|
+
s.add_runtime_dependency(%q<jeweler>, [">= 0"])
|
91
|
+
s.add_runtime_dependency(%q<activerecord>, ["= 2.3.11"])
|
87
92
|
else
|
88
|
-
s.add_dependency(%q<
|
93
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
94
|
+
s.add_dependency(%q<activerecord>, ["= 2.3.11"])
|
95
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
96
|
+
s.add_dependency(%q<activerecord>, ["= 2.3.11"])
|
89
97
|
end
|
90
98
|
else
|
91
|
-
s.add_dependency(%q<
|
99
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
100
|
+
s.add_dependency(%q<activerecord>, ["= 2.3.11"])
|
101
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
102
|
+
s.add_dependency(%q<activerecord>, ["= 2.3.11"])
|
92
103
|
end
|
93
104
|
end
|
94
105
|
|
@@ -6,19 +6,19 @@ describe "Searchlogic::ActiveRecord::AssociationProxy" do
|
|
6
6
|
user = company.users.create(:username => "bjohnson")
|
7
7
|
company.users.send(:username_like, "bjohnson").should == [user]
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
it "should call ordering conditions" do
|
11
11
|
company = Company.create
|
12
12
|
user = company.users.create(:username => "bjohnson")
|
13
13
|
company.users.send(:ascend_by_username).should == [user]
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
it "should call 'or' conditions" do
|
17
17
|
company = Company.create
|
18
18
|
user = company.users.create(:username => "bjohnson")
|
19
19
|
company.users.send(:username_or_some_type_id_like, "bjohnson").should == [user]
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
it "should ignore belongs_to associations" do
|
23
23
|
user = User.create(:male => true)
|
24
24
|
cart = user.carts.create
|
@@ -4,82 +4,82 @@ describe Searchlogic::NamedScopes::AssociationConditions do
|
|
4
4
|
it "should create a named scope" do
|
5
5
|
Company.users_username_like("bjohnson").proxy_options.should == User.username_like("bjohnson").proxy_options.merge(:joins => :users)
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
it "should create a deep named scope" do
|
9
9
|
Company.users_orders_total_greater_than(10).proxy_options.should == Order.total_greater_than(10).proxy_options.merge(:joins => {:users => :orders})
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
it "should allow the use of foreign pre-existing named scopes" do
|
13
13
|
User.named_scope :uname, lambda { |value| {:conditions => ["users.username = ?", value]} }
|
14
14
|
Company.users_uname("bjohnson").proxy_options.should == User.uname("bjohnson").proxy_options.merge(:joins => :users)
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
it "should allow the use of deep foreign pre-existing named scopes" do
|
18
18
|
pending
|
19
19
|
Order.named_scope :big_id, :conditions => "orders.id > 100"
|
20
20
|
Company.users_orders_big_id.proxy_options.should == Order.big_id.proxy_options.merge(:joins => {:users => :orders})
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
it "should allow the use of foreign pre-existing alias scopes" do
|
24
24
|
User.alias_scope :username_has, lambda { |value| User.username_like(value) }
|
25
25
|
Company.users_username_has("bjohnson").proxy_options.should == User.username_has("bjohnson").proxy_options.merge(:joins => :users)
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
it "should not raise errors for scopes that don't return anything" do
|
29
29
|
User.alias_scope :blank_scope, lambda { |value| }
|
30
30
|
Company.users_blank_scope("bjohnson").proxy_options.should == {:joins => :users}
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
it "should ignore polymorphic associations" do
|
34
34
|
lambda { Fee.owner_created_at_gt(Time.now) }.should raise_error(NoMethodError)
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
it "should not allow named scopes on non existent association columns" do
|
38
38
|
lambda { User.users_whatever_like("bjohnson") }.should raise_error(NoMethodError)
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
it "should not allow named scopes on non existent deep association columns" do
|
42
42
|
lambda { User.users_orders_whatever_like("bjohnson") }.should raise_error(NoMethodError)
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
it "should allow named scopes to be called multiple times and reflect the value passed" do
|
46
46
|
Company.users_username_like("bjohnson").proxy_options.should == User.username_like("bjohnson").proxy_options.merge(:joins => :users)
|
47
47
|
Company.users_username_like("thunt").proxy_options.should == User.username_like("thunt").proxy_options.merge(:joins => :users)
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
it "should allow deep named scopes to be called multiple times and reflect the value passed" do
|
51
51
|
Company.users_orders_total_greater_than(10).proxy_options.should == Order.total_greater_than(10).proxy_options.merge(:joins => {:users => :orders})
|
52
52
|
Company.users_orders_total_greater_than(20).proxy_options.should == Order.total_greater_than(20).proxy_options.merge(:joins => {:users => :orders})
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
it "should have an arity of 1 if the underlying scope has an arity of 1" do
|
56
56
|
Company.users_orders_total_greater_than(10)
|
57
57
|
Company.named_scope_arity("users_orders_total_greater_than").should == Order.named_scope_arity("total_greater_than")
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
it "should have an arity of nil if the underlying scope has an arity of nil" do
|
61
61
|
Company.users_orders_total_null
|
62
62
|
Company.named_scope_arity("users_orders_total_null").should == Order.named_scope_arity("total_null")
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
it "should have an arity of -1 if the underlying scope has an arity of -1" do
|
66
66
|
Company.users_id_equals_any
|
67
67
|
Company.named_scope_arity("users_id_equals_any").should == User.named_scope_arity("id_equals_any")
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
it "should allow aliases" do
|
71
71
|
Company.users_username_contains("bjohnson").proxy_options.should == User.username_contains("bjohnson").proxy_options.merge(:joins => :users)
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
it "should allow deep aliases" do
|
75
75
|
Company.users_orders_total_gt(10).proxy_options.should == Order.total_gt(10).proxy_options.merge(:joins => {:users => :orders})
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
it "should copy over the named scope options" do
|
79
79
|
Order.user_whatever_at_equals(1)
|
80
80
|
Order.named_scope_options(:user_whatever_at_equals).searchlogic_options[:skip_conversion].should == true
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
it "should include optional associations" do
|
84
84
|
pending # this is a problem with using inner joins and left outer joins
|
85
85
|
Company.create
|
@@ -88,7 +88,7 @@ describe Searchlogic::NamedScopes::AssociationConditions do
|
|
88
88
|
order = user.orders.create(:total => 20, :taxes => 3)
|
89
89
|
Company.ascend_by_users_orders_total.all.should == Company.all
|
90
90
|
end
|
91
|
-
|
91
|
+
|
92
92
|
it "should implement exclusive scoping" do
|
93
93
|
scope = Company.users_company_name_like("name").users_company_description_like("description")
|
94
94
|
scope.scope(:find)[:joins].should == [
|
@@ -97,7 +97,7 @@ describe Searchlogic::NamedScopes::AssociationConditions do
|
|
97
97
|
]
|
98
98
|
lambda { scope.all }.should_not raise_error
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
it "should not create the same join twice" do
|
102
102
|
scope = Company.users_orders_total_gt(10).users_orders_taxes_lt(5).ascend_by_users_orders_total
|
103
103
|
scope.scope(:find)[:joins].should == [
|
@@ -106,7 +106,7 @@ describe Searchlogic::NamedScopes::AssociationConditions do
|
|
106
106
|
]
|
107
107
|
lambda { scope.count }.should_not raise_error
|
108
108
|
end
|
109
|
-
|
109
|
+
|
110
110
|
it "should not create the same join twice when traveling through the duplicate join" do
|
111
111
|
scope = Company.users_username_like("bjohnson").users_orders_total_gt(100)
|
112
112
|
scope.scope(:find)[:joins].should == [
|
@@ -115,7 +115,7 @@ describe Searchlogic::NamedScopes::AssociationConditions do
|
|
115
115
|
]
|
116
116
|
lambda { scope.count }.should_not raise_error
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
119
|
it "should not create the same join twice when traveling through the deep duplicate join" do
|
120
120
|
scope = Company.users_orders_total_gt(100).users_orders_line_items_price_gt(20)
|
121
121
|
scope.scope(:find)[:joins].should == [
|
@@ -125,35 +125,35 @@ describe Searchlogic::NamedScopes::AssociationConditions do
|
|
125
125
|
]
|
126
126
|
lambda { scope.all }.should_not raise_error
|
127
127
|
end
|
128
|
-
|
128
|
+
|
129
129
|
it "should allow the use of :include when a join was created" do
|
130
130
|
company = Company.create
|
131
131
|
user = company.users.create
|
132
132
|
order = user.orders.create(:total => 20, :taxes => 3)
|
133
133
|
Company.users_orders_total_gt(10).users_orders_taxes_lt(5).ascend_by_users_orders_total.all(:include => :users).should == Company.all
|
134
134
|
end
|
135
|
-
|
135
|
+
|
136
136
|
it "should allow the use of deep :include when a join was created" do
|
137
137
|
company = Company.create
|
138
138
|
user = company.users.create
|
139
139
|
order = user.orders.create(:total => 20, :taxes => 3)
|
140
140
|
Company.users_orders_total_gt(10).users_orders_taxes_lt(5).ascend_by_users_orders_total.all(:include => {:users => :orders}).should == Company.all
|
141
141
|
end
|
142
|
-
|
142
|
+
|
143
143
|
it "should allow the use of :include when traveling through the duplicate join" do
|
144
144
|
company = Company.create
|
145
145
|
user = company.users.create(:username => "bjohnson")
|
146
146
|
order = user.orders.create(:total => 20, :taxes => 3)
|
147
147
|
Company.users_username_like("bjohnson").users_orders_taxes_lt(5).ascend_by_users_orders_total.all(:include => :users).should == Company.all
|
148
148
|
end
|
149
|
-
|
149
|
+
|
150
150
|
it "should allow the use of deep :include when traveling through the duplicate join" do
|
151
151
|
company = Company.create
|
152
152
|
user = company.users.create(:username => "bjohnson")
|
153
153
|
order = user.orders.create(:total => 20, :taxes => 3)
|
154
154
|
Company.users_orders_taxes_lt(50).ascend_by_users_orders_total.all(:include => {:users => :orders}).should == Company.all
|
155
155
|
end
|
156
|
-
|
156
|
+
|
157
157
|
it "should automatically add string joins if the association condition is using strings" do
|
158
158
|
User.named_scope(:orders_big_id, :joins => User.inner_joins(:orders))
|
159
159
|
Company.users_orders_big_id.proxy_options.should == {:joins=>[" INNER JOIN \"users\" ON users.company_id = companies.id ", " INNER JOIN \"orders\" ON orders.user_id = users.id "]}
|
@@ -164,40 +164,50 @@ describe Searchlogic::NamedScopes::AssociationConditions do
|
|
164
164
|
user = company.users.create(:company_id => company.id)
|
165
165
|
company.users.company_id_eq(company.id).should == [user]
|
166
166
|
end
|
167
|
-
|
167
|
+
|
168
168
|
it "should sanitize the scope on a foreign model instead of passing the raw options back to the original" do
|
169
169
|
Company.named_scope(:users_count_10, :conditions => {:users_count => 10})
|
170
170
|
User.company_users_count_10.proxy_options.should == {:conditions => "\"companies\".\"users_count\" = 10", :joins => :company}
|
171
171
|
end
|
172
|
-
|
172
|
+
|
173
173
|
it "should delegate to polymorphic relationships" do
|
174
174
|
Audit.auditable_user_type_name_like("ben").proxy_options.should == {
|
175
175
|
:conditions => ["users.name LIKE ?", "%ben%"],
|
176
176
|
:joins => "INNER JOIN \"users\" ON \"users\".id = \"audits\".auditable_id AND \"audits\".auditable_type = 'User'"
|
177
177
|
}
|
178
178
|
end
|
179
|
-
|
179
|
+
|
180
180
|
it "should delegate to polymorphic relationships (with a lazy split on _type_)" do
|
181
181
|
Audit.auditable_user_type_some_type_id_like("ben").proxy_options.should == {
|
182
182
|
:conditions => ["users.some_type_id LIKE ?", "%ben%"],
|
183
183
|
:joins => "INNER JOIN \"users\" ON \"users\".id = \"audits\".auditable_id AND \"audits\".auditable_type = 'User'"
|
184
184
|
}
|
185
185
|
end
|
186
|
-
|
186
|
+
|
187
187
|
it "should deep delegate to polymorphic relationships" do
|
188
188
|
Audit.auditable_user_type_company_name_like("company").proxy_options.should == {
|
189
189
|
:conditions => ["companies.name LIKE ?", "%company%"],
|
190
190
|
:joins => ["INNER JOIN \"users\" ON \"users\".id = \"audits\".auditable_id AND \"audits\".auditable_type = 'User'", " INNER JOIN \"companies\" ON \"companies\".id = \"users\".company_id "]
|
191
191
|
}
|
192
192
|
end
|
193
|
-
|
193
|
+
|
194
194
|
it "should allow any on a has_many relationship" do
|
195
195
|
company1 = Company.create
|
196
196
|
user1 = company1.users.create
|
197
197
|
company2 = Company.create
|
198
198
|
user2 = company2.users.create
|
199
199
|
user3 = company2.users.create
|
200
|
-
|
200
|
+
|
201
201
|
Company.users_id_equals_any([user2.id, user3.id]).all(:select => "DISTINCT companies.*").should == [company2]
|
202
202
|
end
|
203
|
-
|
203
|
+
|
204
|
+
it "should allow dynamic scope generation on associations without losing association scope options" do
|
205
|
+
user = User.create
|
206
|
+
Order.create :user => user, :shipped_on => Time.now
|
207
|
+
Order.create :shipped_on => Time.now
|
208
|
+
Order.named_scope :shipped_on_not_null, :conditions => ['shipped_on is not null']
|
209
|
+
user.orders.count.should == 1
|
210
|
+
user.orders.shipped_on_not_null.shipped_on_greater_than(2.days.ago).count.should == 1
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
@@ -4,24 +4,31 @@ describe Searchlogic::NamedScopes::Ordering do
|
|
4
4
|
it "should allow ascending" do
|
5
5
|
Company.ascend_by_users_username.proxy_options.should == User.ascend_by_username.proxy_options.merge(:joins => :users)
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
it "should allow descending" do
|
9
9
|
Company.descend_by_users_username.proxy_options.should == User.descend_by_username.proxy_options.merge(:joins => :users)
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
it "should allow deep ascending" do
|
13
13
|
Company.ascend_by_users_orders_total.proxy_options.should == Order.ascend_by_total.proxy_options.merge(:joins => {:users => :orders})
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
it "should allow deep descending" do
|
17
17
|
Company.descend_by_users_orders_total.proxy_options.should == Order.descend_by_total.proxy_options.merge(:joins => {:users => :orders})
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
it "should ascend with a belongs to" do
|
21
21
|
User.ascend_by_company_name.proxy_options.should == Company.ascend_by_name.proxy_options.merge(:joins => :company)
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
it "should work through #order" do
|
25
25
|
Company.order('ascend_by_users_username').proxy_options.should == Company.ascend_by_users_username.proxy_options
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
|
+
it "should ascend with a polymorphic belongs to" do
|
29
|
+
Audit.descend_by_auditable_user_type_username.proxy_options.should ==
|
30
|
+
User.descend_by_username.proxy_options.merge(
|
31
|
+
:joins => "INNER JOIN \"users\" ON \"users\".id = \"audits\".auditable_id AND \"audits\".auditable_type = 'User'"
|
32
|
+
)
|
33
|
+
end
|
34
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -105,6 +105,7 @@ Spec::Runner.configure do |config|
|
|
105
105
|
has_many :carts, :dependent => :destroy
|
106
106
|
has_many :orders, :dependent => :destroy
|
107
107
|
has_many :orders_big, :class_name => 'Order', :conditions => 'total > 100'
|
108
|
+
has_many :audits, :as => :auditable
|
108
109
|
has_and_belongs_to_many :user_groups
|
109
110
|
|
110
111
|
self.skip_time_zone_conversion_for_attributes = [:whatever_at]
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: searchlogic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 2.4.
|
5
|
+
version: 2.4.29
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ben Johnson of Binary Logic
|
@@ -14,16 +14,49 @@ date: 2011-02-28 00:00:00 -05:00
|
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
|
-
name:
|
18
|
-
prerelease: false
|
17
|
+
name: jeweler
|
19
18
|
requirement: &id001 !ruby/object:Gem::Requirement
|
20
19
|
none: false
|
21
20
|
requirements:
|
22
21
|
- - ">="
|
23
22
|
- !ruby/object:Gem::Version
|
24
|
-
version:
|
23
|
+
version: "0"
|
25
24
|
type: :runtime
|
25
|
+
prerelease: false
|
26
26
|
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - "="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 2.3.11
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: jeweler
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "0"
|
46
|
+
type: :runtime
|
47
|
+
prerelease: false
|
48
|
+
version_requirements: *id003
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: activerecord
|
51
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - "="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 2.3.11
|
57
|
+
type: :runtime
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: *id004
|
27
60
|
description: Searchlogic makes using ActiveRecord named scopes easier and less repetitive.
|
28
61
|
email: bjohnson@binarylogic.com
|
29
62
|
executables: []
|
@@ -34,6 +67,8 @@ extra_rdoc_files:
|
|
34
67
|
- LICENSE
|
35
68
|
- README.rdoc
|
36
69
|
files:
|
70
|
+
- Gemfile
|
71
|
+
- Gemfile.lock
|
37
72
|
- LICENSE
|
38
73
|
- README.rdoc
|
39
74
|
- Rakefile
|
@@ -90,6 +125,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
90
125
|
requirements:
|
91
126
|
- - ">="
|
92
127
|
- !ruby/object:Gem::Version
|
128
|
+
hash: -2462757578712156859
|
129
|
+
segments:
|
130
|
+
- 0
|
93
131
|
version: "0"
|
94
132
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
133
|
none: false
|