wildsearcher 1.0.1 → 1.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.
- checksums.yaml +4 -4
- data/README.md +3 -2
- data/lib/wildsearcher.rb +32 -15
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88f537d6cce32f90a38386610a57cb960cbfd521
|
4
|
+
data.tar.gz: ff6e97796a0db8ce2dcb4b3aa4a740a258620b82
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b398f14d06f54626b98b5d51eff51f97bc9b25122674957ba6d43a0f7c5ff83e950d4753f5c7df7cc15f11a7d43e2191cba6fbe612171e68172bf5d141f72f8c
|
7
|
+
data.tar.gz: acf77fd3a8269aeca1209128cf75e01814717309ac5af3746e298c230484d4d5c4d958e243ebd7a05a1a56eac86021c979e8cbd54591688b09297608e9d2f472
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
[](https://travis-ci.org/vivekbisen/wildsearcher)
|
2
|
-
[](https://codeclimate.com/github/vivekbisen/wildsearcher)
|
3
1
|
[](https://badge.fury.io/rb/wildsearcher)
|
2
|
+
[](https://codeclimate.com/github/vivekbisen/wildsearcher)
|
3
|
+
[](https://travis-ci.org/vivekbisen/wildsearcher)
|
4
|
+
[](https://gemnasium.com/vivekbisen/wildsearcher)
|
4
5
|
[](https://rubygems.org/gems/wildsearcher)
|
5
6
|
|
6
7
|
# Wildsearcher
|
data/lib/wildsearcher.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
require "wildsearcher/version"
|
2
|
+
require "wildsearcher/active_record_helper"
|
2
3
|
require "active_record"
|
3
4
|
|
4
5
|
module Wildsearcher
|
6
|
+
include ActiveRecordHelper
|
7
|
+
|
5
8
|
def wildsearcher(params = {})
|
6
9
|
field_array = params[:search_fields].to_s.split(",")
|
7
10
|
term = params[:search_term].to_s.strip
|
@@ -10,35 +13,49 @@ module Wildsearcher
|
|
10
13
|
|
11
14
|
def filter_records(search_fields: [], search_term: "")
|
12
15
|
return default_scope if search_fields.empty? || search_term.blank?
|
16
|
+
check_missing_associations(search_fields)
|
13
17
|
where(conditions(filter_fields(search_fields), search_term))
|
14
18
|
end
|
15
19
|
|
16
20
|
private def filter_fields(fields)
|
17
|
-
fields
|
18
|
-
|
19
|
-
end
|
21
|
+
fields = add_table_name(fields)
|
22
|
+
fields.keep_if { |f| f.to_s.downcase.in?(joined_model_columns(fields)) }
|
20
23
|
end
|
21
24
|
|
22
25
|
private def conditions(fields, term)
|
23
26
|
term = "%" + term.strip + "%" if db_like == "ILIKE"
|
24
|
-
[fields.map { |f| "
|
27
|
+
[fields.map { |f| "CAST(#{f} AS TEXT) #{db_like} ?" }.join(" OR ")] + ([term] * fields.count)
|
25
28
|
end
|
26
29
|
|
27
|
-
private def
|
28
|
-
|
30
|
+
private def joined_model_columns(search_fields)
|
31
|
+
@joined_model_columns ||= begin
|
32
|
+
extract_model_names(search_fields).flat_map do |model_name|
|
33
|
+
extract_column_names(model_name).map do |column_name|
|
34
|
+
"#{model_name.pluralize}.#{column_name}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
29
38
|
end
|
30
39
|
|
31
|
-
private def
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
+
private def extract_model_names(fields)
|
41
|
+
fields.map { |f| f.split('.').first if f.to_s.include?('.') }.compact.uniq
|
42
|
+
end
|
43
|
+
|
44
|
+
private def extract_column_names(model_name)
|
45
|
+
model_name.classify.safe_constantize.try(:column_names).to_a
|
46
|
+
end
|
47
|
+
|
48
|
+
private def add_table_name(fields)
|
49
|
+
fields.map { |f| f.include?('.') ? f : (table_name + '.' + f) }
|
40
50
|
end
|
41
51
|
|
52
|
+
private def check_missing_associations(search_fields)
|
53
|
+
extract_model_names(search_fields).map do |n|
|
54
|
+
unless table_name == n || reflect_on_association(n).present?
|
55
|
+
raise ActiveRecord::AssociationNotFoundError.new(new, n)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
42
59
|
end
|
43
60
|
|
44
61
|
::ActiveRecord::Base.extend(Wildsearcher)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wildsearcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vivek Bisen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,42 +30,42 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '11.1'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '11.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '3.
|
47
|
+
version: '3.4'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
54
|
+
version: '3.4'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: activerecord
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '4.
|
61
|
+
version: '4.2'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '4.
|
68
|
+
version: '4.2'
|
69
69
|
description: Filter your records for your rails app with one line change.
|
70
70
|
email:
|
71
71
|
- vivek@luther.edu
|