simple-search 0.10.3 → 0.11.0
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 +48 -16
- data/VERSION +1 -1
- data/lib/simple_search/active_record.rb +5 -9
- data/lib/simple_search/view_helper.rb +26 -19
- data/simple-search.gemspec +1 -1
- data/test/tables_models.rb +11 -12
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -13,26 +13,54 @@ In your Gemfile:
|
|
13
13
|
|
14
14
|
gem "simple-search" # Last officially released gem
|
15
15
|
|
16
|
+
In your config/environment.rb
|
17
|
+
|
18
|
+
require 'simple_search'
|
19
|
+
|
16
20
|
In your controller:
|
17
21
|
|
18
22
|
def index
|
19
|
-
@posts = Post.
|
20
|
-
|
21
|
-
|
23
|
+
@posts = Post.select('posts.*, comments.id as comment_id, comments.body as comment').joins(:comments)
|
24
|
+
@posts = @posts.simplesearch(params)
|
25
|
+
render :index
|
22
26
|
end
|
23
27
|
|
24
28
|
In your view:
|
25
29
|
|
26
|
-
<%= form_tag('/posts') do -%>
|
27
|
-
<%= text_field_tag 'id_gt' %>
|
28
|
-
<%= text_field_tag '
|
29
|
-
|
30
|
-
<%= submit_tag %>
|
30
|
+
<%= form_tag('/posts', :method=>:GET) do -%>
|
31
|
+
ID > <%= text_field_tag 'id_gt', params[:id_gt] %> <br/>
|
32
|
+
Subject contains <%= text_field_tag 'subject_ct', params[:subject_ct] %> <br/>
|
33
|
+
<%= submit_tag "Search" %>
|
31
34
|
<% end -%>
|
32
35
|
|
33
|
-
|
36
|
+
<style>
|
37
|
+
#pages a {border:1px solid grey; display:inline-block; min-width:13px; text-align:center; text-decoration: none}
|
38
|
+
#pages a:first-child, #pages a:last-child {background-color:grey}
|
39
|
+
#pages a.current {color:white; background-color:#333}
|
40
|
+
</style>
|
41
|
+
<div id="pages">
|
42
|
+
Pages : <%=raw page_urls(@posts).join(" ") %>
|
43
|
+
</div>
|
44
|
+
|
45
|
+
<table>
|
46
|
+
<tr>
|
47
|
+
<th><%=order_link(:id)%></th>
|
48
|
+
<th><%=order_link(:subject)%></th>
|
49
|
+
<th><%=order_link(:body)%></th>
|
50
|
+
<th><%=order_link(:comment_id)%></th>
|
51
|
+
<th><%=order_link(:comment)%></th>
|
52
|
+
</tr>
|
53
|
+
<% @posts.each do |post| %>
|
54
|
+
<tr>
|
55
|
+
<td><%=h post.id %></td>
|
56
|
+
<td><%=h post.subject %></td>
|
57
|
+
<td><%=h post.body %></td>
|
58
|
+
<td><%=h post.comment_id %></td>
|
59
|
+
<td><%=h post.comment %></td>
|
60
|
+
</tr>
|
61
|
+
<% end %>
|
62
|
+
</table>
|
34
63
|
|
35
|
-
<%=page_urls(@posts)%>
|
36
64
|
|
37
65
|
=== Search postfixes
|
38
66
|
|
@@ -43,15 +71,15 @@ In your view:
|
|
43
71
|
* _ge, greater or equal to, <=
|
44
72
|
* _in, includes, IN
|
45
73
|
i.e., &id_in=1,2,3
|
46
|
-
* _bt(_between), between, BETWEEN
|
74
|
+
* _bt (alias of _between), between, BETWEEN
|
47
75
|
i.e., &id_between=1,3
|
48
|
-
* _sw(_startswith), starts with, LIKE 'key%' (
|
49
|
-
* _ew(_endsswith), ends with, LIKE '%key'
|
50
|
-
* _ct(_contains,_like), contains, LIKE '%key%'
|
51
|
-
* _nc(_notcontains,_notlike), not contains, NOT LIKE '%key%'
|
76
|
+
* _sw (alias of _startswith), starts with, LIKE 'key%' (
|
77
|
+
* _ew (alias of _endsswith), ends with, LIKE '%key'
|
78
|
+
* _ct (alias of _contains,_like), contains, LIKE '%key%'
|
79
|
+
* _nc (alias of _notcontains,_notlike), not contains, NOT LIKE '%key%'
|
52
80
|
* _is, IS
|
53
81
|
i.e., &id_is=null
|
54
|
-
* _it(_isnot), IS NOT
|
82
|
+
* _it (alias of _isnot), IS NOT
|
55
83
|
|
56
84
|
=== Sorting your result
|
57
85
|
* order_by
|
@@ -63,6 +91,10 @@ In your view:
|
|
63
91
|
* page_by, number of rows in a page
|
64
92
|
i.e. &page_by=10
|
65
93
|
|
94
|
+
=== Grouping
|
95
|
+
* group_by, column to group
|
96
|
+
i.e. &group_by=posts.id
|
97
|
+
|
66
98
|
== Contributing to simple-search
|
67
99
|
|
68
100
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.11.0
|
@@ -37,18 +37,14 @@ module SimpleSearch
|
|
37
37
|
params.each do |key,value|
|
38
38
|
if ["group_by","page_by","page", "order_by"].include?(key)
|
39
39
|
other_params[key]=value
|
40
|
-
|
40
|
+
elsif value != ''
|
41
41
|
matches = /(.*)_([a-z]+)$/.match(key)
|
42
|
-
if matches.length==3
|
42
|
+
if matches!=nil && matches.length==3
|
43
43
|
all, col, op = matches.to_a
|
44
44
|
operands = SimpleSearch::OP_MAP.keys
|
45
45
|
if operands.include?(op.to_sym)
|
46
46
|
where_params[key]=value
|
47
|
-
else
|
48
|
-
logger.warning("SimpleSearch ignored #{key}. operand must be one of #{operands}") unless logger.nil?
|
49
47
|
end
|
50
|
-
else
|
51
|
-
logger.warning("SimpleSearch ignored #{key}. it requires to end with _<operands>") unless logger.nil?
|
52
48
|
end
|
53
49
|
end
|
54
50
|
end
|
@@ -95,9 +91,9 @@ module SimpleSearch
|
|
95
91
|
end
|
96
92
|
|
97
93
|
def with_ss_limit_offset(arel,params)
|
98
|
-
|
99
|
-
|
100
|
-
arel = arel.limit(page_by).offset( (page_num-1)*page_by )
|
94
|
+
page_by = params['page_by'].to_i
|
95
|
+
page_num = params['page'] ? params['page'].to_i : ( page_by>0 ? 1 : 0 )
|
96
|
+
arel = arel.limit(page_by).offset( (page_num-1)*page_by ) if page_by>0 && page_num>0
|
101
97
|
arel
|
102
98
|
end
|
103
99
|
|
@@ -6,7 +6,7 @@ module SimpleSearch
|
|
6
6
|
# <%= order_by :name %>
|
7
7
|
# <%= order_by :name, 'Company Name' %>
|
8
8
|
# <%= order_by :name, 'Company Name', :class=>'bold' %>
|
9
|
-
def order_link(
|
9
|
+
def order_link(order_to, name=nil, html_options={})
|
10
10
|
raise Exception, "must be used in a view" unless (request.fullpath && request.parameters)
|
11
11
|
|
12
12
|
# check if order_by is in an url array
|
@@ -18,27 +18,31 @@ module SimpleSearch
|
|
18
18
|
if order_by_value
|
19
19
|
order_by_col, current_order = order_by_value.split(" ")
|
20
20
|
else
|
21
|
-
order_by_col, current_order =
|
21
|
+
order_by_col, current_order = order_to.to_s, ""
|
22
22
|
end
|
23
|
+
order_to = order_to.to_s.strip
|
24
|
+
order_by_col.strip!
|
25
|
+
order_by_value.strip! unless order_by_value.nil?
|
23
26
|
|
24
27
|
# determine next order
|
25
|
-
next_order = {
|
28
|
+
next_order = order_to==order_by_col ? {'asc'=>'desc', 'desc'=>'asc'}[current_order] : 'asc'
|
26
29
|
|
27
30
|
# build new url params
|
31
|
+
params = request.parameters.clone
|
28
32
|
new_url_params = if order_arr_key
|
29
|
-
old_arr =
|
30
|
-
new_arr = old_arr.merge(:order_by => "#{
|
31
|
-
|
32
|
-
|
33
|
-
|
33
|
+
old_arr = params[order_arr_key]
|
34
|
+
new_arr = old_arr.merge(:order_by => "#{order_to} #{next_order}")
|
35
|
+
params.merge(order_arr_key => new_arr)
|
36
|
+
else
|
37
|
+
params.merge(:order_by => "#{order_to} #{next_order}" )
|
34
38
|
end
|
35
39
|
|
36
40
|
# build link text
|
37
|
-
name ||=
|
38
|
-
order_indicator = {
|
41
|
+
name ||= order_to.gsub(/_/," ").strip.titleize
|
42
|
+
order_indicator = order_to==order_by_col ? {'asc'=>'▲', 'desc'=>'▼'}[current_order] : ""
|
39
43
|
link_text = "#{name} #{order_indicator}".strip
|
40
44
|
|
41
|
-
link_to link_text, new_url_params, html_options
|
45
|
+
link_to raw(link_text), new_url_params, html_options
|
42
46
|
end
|
43
47
|
|
44
48
|
#
|
@@ -74,12 +78,12 @@ module SimpleSearch
|
|
74
78
|
#
|
75
79
|
# Returns a url params in hash for the page number given
|
76
80
|
#
|
77
|
-
def page_params(page_num, page_arr_key=nil)
|
81
|
+
def page_params(page_num, page_by, page_arr_key=nil)
|
78
82
|
params = if page_arr_key
|
79
83
|
old_arr = request.parameters[page_arr_key].with_indifferent_access
|
80
|
-
request.parameters.merge(page_arr_key => old_arr.merge(:page => page_num) )
|
84
|
+
request.parameters.merge(page_arr_key => old_arr.merge(:page => page_num, :page_by => page_by ) )
|
81
85
|
else
|
82
|
-
request.parameters.merge(:page => page_num )
|
86
|
+
request.parameters.merge(:page => page_num, :page_by => page_by )
|
83
87
|
end
|
84
88
|
params.with_indifferent_access
|
85
89
|
end
|
@@ -87,8 +91,9 @@ module SimpleSearch
|
|
87
91
|
#
|
88
92
|
# Returns page url params in hash with the page number as key
|
89
93
|
#
|
90
|
-
def page_url_params(arel,
|
91
|
-
page_props = page_properties(arel)
|
94
|
+
def page_url_params(arel, options={})
|
95
|
+
page_props = options[:page_props] || page_properties(arel)
|
96
|
+
num_pages = options[:num_pages] || 5
|
92
97
|
num_bf_af = (num_pages-1)/2
|
93
98
|
current_page = page_props[:current_page]
|
94
99
|
last_page = page_props[:last_page]
|
@@ -100,7 +105,7 @@ module SimpleSearch
|
|
100
105
|
|
101
106
|
page_url_params = {}
|
102
107
|
for num in page_numbers
|
103
|
-
page_url_params[num] = page_params(num, page_props[:page_arr_key])
|
108
|
+
page_url_params[num] = page_params(num, page_props[:rows_per_page], page_props[:page_arr_key])
|
104
109
|
end
|
105
110
|
|
106
111
|
page_url_params
|
@@ -109,11 +114,13 @@ module SimpleSearch
|
|
109
114
|
def page_urls(arel, http_options={})
|
110
115
|
page_urls = []
|
111
116
|
prev_page = 0
|
112
|
-
|
117
|
+
page_props = page_properties(arel)
|
118
|
+
page_url_params(arel, :page_props => page_props ).each { |page, url_params|
|
113
119
|
if page.to_i > (prev_page+1) # page number jumped up, need to have some indicator
|
114
120
|
page_urls << "<span class='filler'>...</span>"
|
115
121
|
end
|
116
|
-
|
122
|
+
new_options = page_props[:current_page] == page ? http_options.merge({:class => 'current'}) : http_options
|
123
|
+
page_urls << link_to(page, url_params, new_options)
|
117
124
|
prev_page = page
|
118
125
|
}
|
119
126
|
page_urls
|
data/simple-search.gemspec
CHANGED
data/test/tables_models.rb
CHANGED
@@ -14,30 +14,29 @@ ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'post_likes'")
|
|
14
14
|
|
15
15
|
# create tables
|
16
16
|
ActiveRecord::Base.connection.create_table(:posts) do |t|
|
17
|
-
|
18
|
-
|
17
|
+
t.string :subject
|
18
|
+
t.text :body
|
19
19
|
end
|
20
20
|
ActiveRecord::Base.connection.create_table(:comments) do |t|
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
t.string :post_id
|
22
|
+
t.text :body
|
23
|
+
t.boolean :spam_flag
|
24
24
|
end
|
25
25
|
ActiveRecord::Base.connection.create_table(:post_likes) do |t|
|
26
|
-
|
27
|
-
|
26
|
+
t.string :post_id
|
27
|
+
t.boolean :like
|
28
28
|
end
|
29
29
|
|
30
30
|
# models
|
31
31
|
class Post < ActiveRecord::Base
|
32
|
-
|
33
|
-
|
32
|
+
has_many :comments
|
33
|
+
has_many :post_likes
|
34
34
|
end
|
35
35
|
class Comment < ActiveRecord::Base
|
36
|
-
|
37
|
-
has_many :votes
|
36
|
+
belongs_to :post
|
38
37
|
end
|
39
38
|
class PostLike < ActiveRecord::Base
|
40
|
-
|
39
|
+
belongs_to :post
|
41
40
|
end
|
42
41
|
|
43
42
|
# insert tables
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: simple-search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.11.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Allen Kim
|
@@ -152,7 +152,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
152
152
|
requirements:
|
153
153
|
- - ">="
|
154
154
|
- !ruby/object:Gem::Version
|
155
|
-
hash:
|
155
|
+
hash: 1273856401880201172
|
156
156
|
segments:
|
157
157
|
- 0
|
158
158
|
version: "0"
|