scoped_search 2.3.3 → 2.3.4
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.
@@ -191,7 +191,8 @@ module ScopedSearch
|
|
191
191
|
return complete_key_value(field, token, val) if field.key_field
|
192
192
|
|
193
193
|
opts = value_conditions(field.field, val)
|
194
|
-
|
194
|
+
table = field.klass.connection.quote_table_name(field.klass.table_name)
|
195
|
+
opts.merge!(:limit => 20, :select => "DISTINCT #{table}.#{field.field}")
|
195
196
|
|
196
197
|
return completer_scope(field.klass).all(opts).map(&field.field).compact.map{|v| v.to_s =~ /\s+/ ? "\"#{v}\"" : v}
|
197
198
|
end
|
@@ -165,7 +165,10 @@ module ScopedSearch
|
|
165
165
|
# this method return definitions::field object from string
|
166
166
|
def field_by_name(name)
|
167
167
|
field = fields[name.to_sym]
|
168
|
-
field
|
168
|
+
if field.nil?
|
169
|
+
dotted = name.to_s.split('.')[0]
|
170
|
+
field = fields[dotted.to_sym] unless dotted.nil?
|
171
|
+
end
|
169
172
|
field
|
170
173
|
end
|
171
174
|
|
@@ -44,6 +44,8 @@ module ScopedSearch
|
|
44
44
|
# Actually builds the find parameters hash that should be used in the search_for
|
45
45
|
# named scope.
|
46
46
|
def build_find_params(options)
|
47
|
+
keyconditions = []
|
48
|
+
keyparameters = []
|
47
49
|
parameters = []
|
48
50
|
includes = []
|
49
51
|
joins = []
|
@@ -55,6 +57,8 @@ module ScopedSearch
|
|
55
57
|
# Store the parameters, includes, etc so that they can be added to
|
56
58
|
# the find-hash later on.
|
57
59
|
case notification
|
60
|
+
when :keycondition then keyconditions << value
|
61
|
+
when :keyparameter then keyparameters << value
|
58
62
|
when :parameter then parameters << value
|
59
63
|
when :include then includes << value
|
60
64
|
when :joins then joins << value
|
@@ -70,10 +74,10 @@ module ScopedSearch
|
|
70
74
|
else raise ScopedSearch::QueryNotSupported, "Cannot handle #{notification.inspect}: #{value.inspect}"
|
71
75
|
end
|
72
76
|
end
|
73
|
-
|
77
|
+
sql = (keyconditions + (sql.nil? ? [] : [sql]) ).map {|c| "(#{c})"}.join(" AND ")
|
74
78
|
# Build hash for ActiveRecord::Base#find for the named scope
|
75
79
|
find_attributes = {}
|
76
|
-
find_attributes[:conditions] = [sql] + parameters unless sql.
|
80
|
+
find_attributes[:conditions] = [sql] + keyparameters + parameters unless sql.blank?
|
77
81
|
find_attributes[:include] = includes.uniq unless includes.empty?
|
78
82
|
find_attributes[:joins] = joins.uniq unless joins.empty?
|
79
83
|
find_attributes[:order] = order unless order.nil?
|
@@ -196,7 +200,7 @@ module ScopedSearch
|
|
196
200
|
def sql_test(field, operator, value, lhs, &block) # :yields: finder_option_type, value
|
197
201
|
return field.to_ext_method_sql(lhs, sql_operator(operator, field), value, &block) if field.ext_method
|
198
202
|
|
199
|
-
yield(:
|
203
|
+
yield(:keyparameter, lhs.sub(/^.*\./,'')) if field.key_field
|
200
204
|
|
201
205
|
if [:like, :unlike].include?(operator)
|
202
206
|
yield(:parameter, (value !~ /^\%|\*/ && value !~ /\%|\*$/) ? "%#{value}%" : value.tr_s('%*', '%'))
|
@@ -227,14 +231,14 @@ module ScopedSearch
|
|
227
231
|
connection = klass.connection
|
228
232
|
if key_relation
|
229
233
|
yield(:joins, construct_join_sql(key_relation, num) )
|
234
|
+
yield(:keycondition, "#{key_klass.table_name}_#{num}.#{connection.quote_column_name(key_field.to_s)} = ?")
|
230
235
|
klass_table_name = relation ? "#{klass.table_name}_#{num}" : connection.quote_table_name(klass.table_name)
|
231
|
-
return "#{
|
232
|
-
"#{klass_table_name}.#{connection.quote_column_name(field.to_s)}"
|
236
|
+
return "#{klass_table_name}.#{connection.quote_column_name(field.to_s)}"
|
233
237
|
elsif key_field
|
234
238
|
yield(:joins, construct_simple_join_sql(num))
|
239
|
+
yield(:keycondition, "#{key_klass.table_name}_#{num}.#{connection.quote_column_name(key_field.to_s)} = ?")
|
235
240
|
klass_table_name = relation ? "#{klass.table_name}_#{num}" : connection.quote_table_name(klass.table_name)
|
236
|
-
return "#{
|
237
|
-
"#{klass_table_name}.#{connection.quote_column_name(field.to_s)}"
|
241
|
+
return "#{klass_table_name}.#{connection.quote_column_name(field.to_s)}"
|
238
242
|
elsif relation
|
239
243
|
yield(:include, relation)
|
240
244
|
end
|
data/lib/scoped_search.rb
CHANGED
@@ -14,7 +14,7 @@ module ScopedSearch
|
|
14
14
|
|
15
15
|
# The current scoped_search version. Do not change thisvalue by hand,
|
16
16
|
# because it will be updated automatically by the gem release script.
|
17
|
-
VERSION = "2.3.
|
17
|
+
VERSION = "2.3.4"
|
18
18
|
|
19
19
|
# The ClassMethods module will be included into the ActiveRecord::Base class
|
20
20
|
# to add the <tt>ActiveRecord::Base.scoped_search</tt> method and the
|
data/scoped_search.gemspec
CHANGED
@@ -3,8 +3,8 @@ 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.3.
|
7
|
-
s.date = "2011-
|
6
|
+
s.version = "2.3.4"
|
7
|
+
s.date = "2011-10-03"
|
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
|
@@ -56,6 +56,10 @@ require "#{File.dirname(__FILE__)}/../spec_helper"
|
|
56
56
|
Bar.search_for('facts.color = green').should have(1).items
|
57
57
|
end
|
58
58
|
|
59
|
+
it "should find all bars with a fact name color and fact value gold" do
|
60
|
+
Bar.search_for('facts.color = gold').first.name.should eql('barbary')
|
61
|
+
end
|
62
|
+
|
59
63
|
it "should find all bars with a fact name size and fact value 5" do
|
60
64
|
Bar.search_for('facts.size = 5').should have(1).items
|
61
65
|
end
|
@@ -64,6 +68,10 @@ require "#{File.dirname(__FILE__)}/../spec_helper"
|
|
64
68
|
Bar.search_for('facts.color = green and facts.size = 5').should have(1).items
|
65
69
|
end
|
66
70
|
|
71
|
+
it "should find all bars with a fact color gold or green" do
|
72
|
+
Bar.search_for('facts.color = gold or facts.color = green').should have(2).items
|
73
|
+
end
|
74
|
+
|
67
75
|
it "should find all bars that has size value" do
|
68
76
|
Bar.search_for('has facts.size').should have(1).items
|
69
77
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scoped_search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 2.3.
|
9
|
+
- 4
|
10
|
+
version: 2.3.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Willem van Bergen
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-
|
19
|
+
date: 2011-10-03 00:00:00 +02:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|