simple_search 0.0.1 → 0.0.2
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 +59 -12
- data/VERSION +1 -1
- data/lib/simple_search/search.rb +20 -1
- data/lib/simple_search.rb +1 -2
- data/simple_search.gemspec +1 -2
- metadata +2 -3
- data/lib/simple_search/searchable.rb +0 -30
data/README.rdoc
CHANGED
@@ -1,17 +1,64 @@
|
|
1
|
-
=
|
1
|
+
= SimpleSearch
|
2
2
|
|
3
|
-
|
3
|
+
A rather unimaginatively named gem designed to provide simple search functionality to ActiveRecord-backed
|
4
|
+
models and, more usefully, views.
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
Given a model Widget that belongs_to a WidgetType, shouldn't you be able to do something like this ...
|
7
|
+
|
8
|
+
<% form_for :search, @search, :html => {:method => :get} do |f| %>
|
9
|
+
<%= f.label :name %>
|
10
|
+
<%= f.text_field :name %>
|
11
|
+
<%= f.label :widget_type_name_starts_with %>
|
12
|
+
<%= f.text_field :widget_type_name_starts_with %>
|
13
|
+
<%= f.submit %>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
... to create a search form?
|
17
|
+
|
18
|
+
Yes. Yes, you should.
|
19
|
+
|
20
|
+
== Example
|
21
|
+
|
22
|
+
Let's say you're going to add a search form to your index page like the one above.
|
23
|
+
|
24
|
+
In your controller:
|
25
|
+
|
26
|
+
Grab the search params or set a default.
|
27
|
+
|
28
|
+
search = params[:search] || {}
|
29
|
+
|
30
|
+
Merge in any additional criteria, or add an association to the search. Here,
|
31
|
+
I only want to find Widgets that are less than a week old, and I want to be able
|
32
|
+
to search on attributes of the Widget's WidgetType as well.
|
33
|
+
|
34
|
+
@search = SimpleSearch::Search.new(
|
35
|
+
Widget,
|
36
|
+
search.merge(:created_at_from => 1.week.ago, :search_associations => :widget_type)
|
37
|
+
)
|
38
|
+
|
39
|
+
This will do a full search, and use pagination. All options are passed through to find or
|
40
|
+
paginate (will_paginate), as required.
|
41
|
+
@widgets = @search.search(:page => params[:page])
|
42
|
+
|
43
|
+
Or if you just want to count the records that would be matched.
|
44
|
+
|
45
|
+
@count = @search.count
|
46
|
+
|
47
|
+
Then in your view:
|
48
|
+
|
49
|
+
<% form_for :search, @search, :html => {:method => :get} do |f| %>
|
50
|
+
<%= f.label :name %>
|
51
|
+
<%= f.text_field :name %>
|
52
|
+
<%= f.label :widget_type_name_starts_with %>
|
53
|
+
<%= f.text_field :widget_type_name_starts_with %>
|
54
|
+
<%= f.submit %>
|
55
|
+
<% end %>
|
56
|
+
|
57
|
+
Remember, searches are idempotent so to appease the HTTP gods (and make it easy to bookmark
|
58
|
+
search results) they should be executed with GET.
|
59
|
+
|
60
|
+
That should get you started, for now.
|
14
61
|
|
15
62
|
== Copyright
|
16
63
|
|
17
|
-
Copyright (c) 2010 Ernie Miller. See LICENSE for details.
|
64
|
+
Copyright (c) 2010 {Ernie Miller}[http://metautonomo.us]. See LICENSE for details.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/lib/simple_search/search.rb
CHANGED
@@ -3,7 +3,6 @@ module SimpleSearch
|
|
3
3
|
attr_reader :options, :associations
|
4
4
|
|
5
5
|
def initialize(model, options = {})
|
6
|
-
raise StandardError, "#{model.to_s} is not searchable" unless model.metaclass.method_defined?(:search)
|
7
6
|
@model = model
|
8
7
|
@associations = [*options.delete(:search_associations)].compact
|
9
8
|
@association_objects = @associations.map do |a|
|
@@ -35,6 +34,26 @@ module SimpleSearch
|
|
35
34
|
|
36
35
|
conditions.blank? ? [] : [conditions.join(" AND "), *parameters]
|
37
36
|
end
|
37
|
+
|
38
|
+
def search(args = {})
|
39
|
+
args.merge!(
|
40
|
+
:conditions => self.conditions,
|
41
|
+
:include => (self.associations + [*args[:include]]).compact.uniq
|
42
|
+
)
|
43
|
+
if @model.respond_to?(:paginate) && args.has_key?(:page)
|
44
|
+
@model.paginate(:all, args)
|
45
|
+
else
|
46
|
+
@model.find(:all, args)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def count(args = {})
|
51
|
+
args.merge!(
|
52
|
+
:conditions => self.conditions,
|
53
|
+
:include => (self.associations + [*args[:include]]).compact.uniq
|
54
|
+
)
|
55
|
+
@model.count(args)
|
56
|
+
end
|
38
57
|
|
39
58
|
private
|
40
59
|
|
data/lib/simple_search.rb
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
require 'simple_search/search'
|
2
|
-
require 'simple_search/searchable'
|
1
|
+
require 'simple_search/search'
|
data/simple_search.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{simple_search}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ernie Miller"]
|
@@ -25,7 +25,6 @@ Gem::Specification.new do |s|
|
|
25
25
|
"VERSION",
|
26
26
|
"lib/simple_search.rb",
|
27
27
|
"lib/simple_search/search.rb",
|
28
|
-
"lib/simple_search/searchable.rb",
|
29
28
|
"simple_search.gemspec",
|
30
29
|
"test/helper.rb",
|
31
30
|
"test/test_simple_search.rb"
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Ernie Miller
|
@@ -47,7 +47,6 @@ files:
|
|
47
47
|
- VERSION
|
48
48
|
- lib/simple_search.rb
|
49
49
|
- lib/simple_search/search.rb
|
50
|
-
- lib/simple_search/searchable.rb
|
51
50
|
- simple_search.gemspec
|
52
51
|
- test/helper.rb
|
53
52
|
- test/test_simple_search.rb
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module SimpleSearch
|
2
|
-
module Searchable
|
3
|
-
module ClassMethods
|
4
|
-
# The "s" parameter is an instance of Search, instantiated from form input.
|
5
|
-
def search(s, args = {})
|
6
|
-
args.merge!(
|
7
|
-
:conditions => s.conditions,
|
8
|
-
:include => (s.associations + [*args[:include]]).compact.uniq
|
9
|
-
)
|
10
|
-
if self.respond_to?(:paginate) && args.has_key?(:page)
|
11
|
-
self.paginate(:all, args)
|
12
|
-
else
|
13
|
-
self.find(:all, args)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def search_count(s, args = {})
|
18
|
-
args.merge!(
|
19
|
-
:conditions => s.conditions,
|
20
|
-
:include => (s.associations + [*args[:include]]).compact.uniq
|
21
|
-
)
|
22
|
-
self.count(args)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.included(base)
|
27
|
-
base.extend(ClassMethods)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|