smart_filter 0.1.1
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/Manifest +6 -0
- data/README.rdoc +63 -0
- data/Rakefile +14 -0
- data/init.rb +1 -0
- data/lib/smart_filter.rb +46 -0
- data/smart_filter.gemspec +29 -0
- metadata +77 -0
data/Manifest
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
= SmartFilter
|
2
|
+
|
3
|
+
Rails gem to extend ActiveRecord with a smart_filter method.
|
4
|
+
|
5
|
+
|
6
|
+
== Installation
|
7
|
+
|
8
|
+
[As a gem (using Bundler)] gem "smart_filter", "~> 0.1.0" # hosted on rubygems.com
|
9
|
+
[As a plugin] script/plugin install git://github.com/vvohra87/smart_filter.git
|
10
|
+
|
11
|
+
|
12
|
+
== Why smart_filter?
|
13
|
+
|
14
|
+
In most applications, I need the following types of search / filter options:
|
15
|
+
1. %LIKE% matches for any text or string field such as "name", "description", "email", "address", etc
|
16
|
+
2. Exact matches for any integer, date or datetime field such as "quantity", "id", "created_at", "start", "age", etc
|
17
|
+
3. Range matches for any integer, decimal, float, date or datetime such as "price", "age", "created_at", etc
|
18
|
+
|
19
|
+
SmartFilter simply provides a simple way to do just that.
|
20
|
+
|
21
|
+
This is not meant to replace gems like meta-where / arel-table based query builders / search engines, just make life easier by having to write less code! (and apparently more documentation!)
|
22
|
+
|
23
|
+
|
24
|
+
== How it works
|
25
|
+
|
26
|
+
Once you have included the gem in your app, you now have a +smart_filter+ method for all your models.
|
27
|
+
|
28
|
+
The method takes in a hash whose keys are dependent on the model definition.
|
29
|
+
|
30
|
+
For numeric and datetime based columns it will accept 3 different inputs:
|
31
|
+
1. column => value # will return exact match for value
|
32
|
+
2. column_min => value # will return all records where attribute has value greater than or equal to specified value
|
33
|
+
3. column_max => value # will return all records where attribute has value less than or equal to specified value
|
34
|
+
|
35
|
+
For string and text based columns it will accept only the column name.
|
36
|
+
|
37
|
+
|
38
|
+
== Example
|
39
|
+
|
40
|
+
Let's say that you have a Product model with the following attributes:
|
41
|
+
|
42
|
+
title: string
|
43
|
+
description: text
|
44
|
+
price: float
|
45
|
+
current_stock: integer
|
46
|
+
created_at: datetime
|
47
|
+
|
48
|
+
|
49
|
+
So, on this the full set of options you would have is:
|
50
|
+
|
51
|
+
Product.smart_filter(
|
52
|
+
:title => "abc" # where the title contains 'abc'
|
53
|
+
:description => "cba" # where the description contains 'cba'
|
54
|
+
:price => 5.0 # where the price is exactly 5.0
|
55
|
+
:price_min => 10.0 # where the price is greater than or equal to 10.0
|
56
|
+
:price_max => 20.0 # where the price is less than or equal to 20.0
|
57
|
+
:current_stock => 55 # where the current stock is exactly 55
|
58
|
+
:current_stock_min => 20 # .....etc.....
|
59
|
+
:current_stock_max => 100 # .....etc.....
|
60
|
+
:created_at => Time.now
|
61
|
+
:created_at_min => Time.now - 1.week
|
62
|
+
:created_at_max => Time.now - 2.days
|
63
|
+
)
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('smart_filter', '0.1.1') do |p|
|
6
|
+
p.description = "Extend Active Record to provide a smart filter function."
|
7
|
+
p.url = "http://github.com/vvohra87/smart_filter"
|
8
|
+
p.author = "Varun Vohra"
|
9
|
+
p.email = "varun@genii.in"
|
10
|
+
p.ignore_pattern = ["tmp/*", "script/*"]
|
11
|
+
p.development_dependencies = []
|
12
|
+
end
|
13
|
+
|
14
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'smart_filter'
|
data/lib/smart_filter.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
module SmartFilter
|
2
|
+
def self.included(base)
|
3
|
+
base.extend ClassMethods
|
4
|
+
end
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
|
8
|
+
def smart_filter(args = {})
|
9
|
+
numerics = []
|
10
|
+
strings = []
|
11
|
+
self.columns.each do |column|
|
12
|
+
case column.type
|
13
|
+
when :integer, :decimal, :float, :date, :datetime
|
14
|
+
numerics.push(column.name.to_sym)
|
15
|
+
numerics.push((column.name.to_s + "_min").to_sym)
|
16
|
+
numerics.push((column.name.to_s + "_max").to_sym)
|
17
|
+
when :string, :text
|
18
|
+
strings.push(column.name.to_sym)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
results = self.select("*")
|
23
|
+
|
24
|
+
args.each do |key, value|
|
25
|
+
if numerics.include?(key)
|
26
|
+
if key.ends_with("_min")
|
27
|
+
results = results.where("#{key} >= #{value}")
|
28
|
+
elsif key.ends_with("_max")
|
29
|
+
results = results.where("#{key} <= #{value}")
|
30
|
+
else
|
31
|
+
results = results.where("#{key} = #{value}")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
if strings.include?(key)
|
35
|
+
results = results.where("#{key} like '%#{value}%'")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
results
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class ActiveRecord::Base
|
45
|
+
include SmartFilter
|
46
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "smart_filter"
|
5
|
+
s.version = "0.1.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Varun Vohra"]
|
9
|
+
s.date = "2012-01-31"
|
10
|
+
s.description = "Extend Active Record to provide a smart filter function."
|
11
|
+
s.email = "varun@genii.in"
|
12
|
+
s.extra_rdoc_files = ["README.rdoc", "lib/smart_filter.rb"]
|
13
|
+
s.files = ["Manifest", "README.rdoc", "Rakefile", "init.rb", "lib/smart_filter.rb", "smart_filter.gemspec"]
|
14
|
+
s.homepage = "http://github.com/vvohra87/smart_filter"
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Smart_filter", "--main", "README.rdoc"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = "smart_filter"
|
18
|
+
s.rubygems_version = "1.8.13"
|
19
|
+
s.summary = "Extend Active Record to provide a smart filter function."
|
20
|
+
|
21
|
+
if s.respond_to? :specification_version then
|
22
|
+
s.specification_version = 3
|
23
|
+
|
24
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
25
|
+
else
|
26
|
+
end
|
27
|
+
else
|
28
|
+
end
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: smart_filter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Varun Vohra
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-01-31 00:00:00 Z
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: Extend Active Record to provide a smart filter function.
|
22
|
+
email: varun@genii.in
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files:
|
28
|
+
- README.rdoc
|
29
|
+
- lib/smart_filter.rb
|
30
|
+
files:
|
31
|
+
- Manifest
|
32
|
+
- README.rdoc
|
33
|
+
- Rakefile
|
34
|
+
- init.rb
|
35
|
+
- lib/smart_filter.rb
|
36
|
+
- smart_filter.gemspec
|
37
|
+
homepage: http://github.com/vvohra87/smart_filter
|
38
|
+
licenses: []
|
39
|
+
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options:
|
42
|
+
- --line-numbers
|
43
|
+
- --inline-source
|
44
|
+
- --title
|
45
|
+
- Smart_filter
|
46
|
+
- --main
|
47
|
+
- README.rdoc
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
hash: 3
|
56
|
+
segments:
|
57
|
+
- 0
|
58
|
+
version: "0"
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
hash: 11
|
65
|
+
segments:
|
66
|
+
- 1
|
67
|
+
- 2
|
68
|
+
version: "1.2"
|
69
|
+
requirements: []
|
70
|
+
|
71
|
+
rubyforge_project: smart_filter
|
72
|
+
rubygems_version: 1.8.13
|
73
|
+
signing_key:
|
74
|
+
specification_version: 3
|
75
|
+
summary: Extend Active Record to provide a smart filter function.
|
76
|
+
test_files: []
|
77
|
+
|