make_model_searchable 0.1.1 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 869edeb1e4a767676fe077bb8d00d291b887147c
4
- data.tar.gz: 52989316f144003d1382cd8ad6d339a53ab50b06
3
+ metadata.gz: 991de978ccef72bc0863c5397700e2c296641b02
4
+ data.tar.gz: 94300071ad25d62ba74a4dbc895ee04d88b44f05
5
5
  SHA512:
6
- metadata.gz: 1d2618c99d9d70b8b3b7732329a0f2eed38083eab7b7fb41aff661299286ac27bee626038bc3dcfb09ce98844f47efcfa5835b1718bc1cb14ec56fd652eee9f0
7
- data.tar.gz: 71de900ab1b4eeb9e92e4306e4523d1384b8eb0ff6cbbd4ce0a9dc24fbff9130340b02ffec1b3f6d8ee5079ab84c5e67ae45f0bf67ec468501445c83fdc2b252
6
+ metadata.gz: 431aa130285c9c5a9506e495d9650d26976486cb506faca2dccaff74aa6988396f744565bdab584eb5ae98b55a1a4852a9e8f7d894f22cc9f20cbec54bfc7ecd
7
+ data.tar.gz: 3556cc7169598aadfae0ff9874ac01d31f852118439de5ddd41aa0df62c45b5bfc0ace18f56ed5a6135c8bdd42ea37e2607bd488a2a64ac1f0623b51d4b865c2
data/.gitignore CHANGED
@@ -6,4 +6,5 @@
6
6
  /doc/
7
7
  /pkg/
8
8
  /spec/reports/
9
- /tmp/
9
+ /tmp/
10
+ /*.gem
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
- # MakeModelSearchable
1
+ # MakeModelSearchable
2
+ [![Code Triagers Badge](https://www.codetriage.com/8parth/make_model_searchable/badges/users.svg)](https://www.codetriage.com/8parth/make_model_searchable) [![Code Climate](https://codeclimate.com/github/8parth/make_model_searchable/badges/gpa.svg)](https://codeclimate.com/github/8parth/make_model_searchable) [![Gem Version](https://badge.fury.io/rb/make_model_searchable.svg)](https://badge.fury.io/rb/make_model_searchable)
2
3
 
3
4
  Moduler solution to add search functionality for selected fields.
4
5
 
@@ -51,4 +52,4 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERN
51
52
 
52
53
  ## License
53
54
 
54
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
55
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -4,12 +4,32 @@ require 'active_record'
4
4
  module MakeModelSearchable
5
5
 
6
6
  def searchable_attributes(*options)
7
- options = options.collect{ |option| option.to_s }
7
+ joined_options = options.select{ |option| option.is_a? (Hash) }
8
+ options = options.select{ |option| !option.is_a?(Hash) }
8
9
  self.connection
9
10
  setup_fields(options)
11
+ if joined_options.present?
12
+ setup_joined_fields(joined_options)
13
+ end
10
14
  self.extend(ClassMethods)
11
15
  end
12
16
 
17
+ def setup_joined_fields(options_array)
18
+ joined_fields = []
19
+ association_names = self.reflect_on_all_associations.map(&:name)
20
+ valid_opts = options_array.first.select {|k,v| association_names.include?(k)}
21
+ if valid_opts
22
+ valid_opts.each do |key, val|
23
+ joined_fields << get_valid_joined_fields(key, val)
24
+ end
25
+ if joined_fields.present?
26
+ self.instance_variable_set(:@joined_fields, joined_fields.flatten)
27
+ end
28
+ else
29
+ raise Exception.new, "Please pass valid attributes for class: #{self.name}"
30
+ end
31
+ end
32
+
13
33
  def setup_fields(options)
14
34
  unless options.present?
15
35
  options = self.column_names
@@ -28,29 +48,56 @@ module MakeModelSearchable
28
48
  end
29
49
  end
30
50
  if searchable_columns.present?
31
- options.select{ |option| searchable_columns.include?(option) }
51
+ options.select!{ |option| searchable_columns.include?(option.to_s) }
32
52
  else
33
53
  options = []
34
54
  end
35
55
  options
36
56
  end
37
57
 
58
+ def get_valid_joined_fields(key, columns_array)
59
+ associated_model = self.reflect_on_association(key).klass
60
+ associated_model.connection
61
+ if columns_array.empty?
62
+ options = associated_model.columns.select{ |col| col.type == :string or col.type == :text }
63
+ else
64
+ options = associated_model.columns.select{ |col| (col.type == :string or col.type == :text) and columns_array.include?(col.name.to_sym) }
65
+ end
66
+ options
67
+ end
68
+
38
69
  module ClassMethods
39
70
  def search(search_term)
40
71
  valid_fields = self.instance_variable_get(:@selected_fields)
72
+ joined_fields = self.instance_variable_get(:@joined_fields)
73
+
41
74
  if valid_fields.present?
42
75
  if search_term
43
76
  search_term = "%#{search_term.downcase}%"
44
- users = self.arel_table
77
+ own_table = self.arel_table
45
78
  arel_node = Arel::Nodes::Node.new
46
79
  valid_fields.each_with_index do |val, index|
47
80
  if index == 0
48
- arel_node = users[val].lower.matches(search_term)
81
+ arel_node = own_table[val].lower.matches(search_term)
49
82
  else
50
- arel_node = arel_node.or(users[val].lower.matches(search_term))
83
+ arel_node = arel_node.or(own_table[val].lower.matches(search_term))
84
+ end
85
+ end
86
+ join_table_names = []
87
+ if joined_fields.present?
88
+ joined_fields.each do |field|
89
+ if field.respond_to? "table_name"
90
+ join_table_names << field.table_name.to_sym
91
+ associated_relation = self.reflect_on_association(field.table_name).klass.arel_table
92
+ if arel_node.present?
93
+ arel_node = arel_node.or(associated_relation[field.name].lower.matches(search_term))
94
+ else
95
+ arel_node = associated_relation[field.name].lower.matches(search_term)
96
+ end
97
+ end
51
98
  end
52
99
  end
53
- where(arel_node)
100
+ joins(join_table_names).where(arel_node)
54
101
  else
55
102
  all
56
103
  end
@@ -58,31 +105,6 @@ module MakeModelSearchable
58
105
  raise Exception, "Please pass valid attributes for class: #{self.name}"
59
106
  end
60
107
  end
61
-
62
- # def get_valid_fields(fields)
63
- # column_names = self.columns.map(&:name)
64
- # column_types = self.columns.map(&:type)
65
- # fields.reject { |element| !column_names.include?(element) or column_types[element].type != :string }
66
- # end
67
-
68
- # def get_join_fields(fields, associations)
69
- # # self.reflect_on_association(:emails).class_name.constantize.column_names
70
- # column_names = []
71
- # associations.each do |association_name|
72
- # # association_name
73
- # column_names << self.reflect_on_association(association_name).class_name.constantize.column_names
74
- # end
75
- # column_names.flatten!
76
- # column_names.uniq!
77
-
78
- # fields.reject { |element| !column_names.include?(element) }
79
- # end
80
-
81
- # def get_valid_associations(associations)
82
- # associations.collect! { |assoc| assoc.to_sym }
83
- # association_names = self.reflect_on_all_associations.collect{|assoc| assoc.name }
84
- # associations.reject { |element| !association_names.include?(element) }
85
- # end
86
108
  end
87
109
  ActiveRecord::Base.extend MakeModelSearchable
88
110
  end
@@ -1,3 +1,3 @@
1
1
  module MakeModelSearchable
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -27,9 +27,12 @@ Gem::Specification.new do |spec|
27
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
28
  spec.require_paths = ["lib"]
29
29
 
30
- spec.add_development_dependency 'activerecord', '~> 3.0', '>= 3.0.0'
31
- spec.add_development_dependency 'activesupport', '~> 3.0', '>= 3.0.0'
30
+ spec.add_development_dependency 'activerecord', '~> 4.0', '>= 4.0.0'
31
+ spec.add_development_dependency 'activesupport', '~> 4.0', '>= 4.0.0'
32
+ spec.add_development_dependency 'sqlite3', '~> 0'
32
33
  spec.add_development_dependency "bundler", "~> 1.12"
33
34
  spec.add_development_dependency "rake", "~> 10.0"
34
- spec.add_development_dependency "rspec", "~> 3.0"
35
+ spec.add_development_dependency 'rspec', '~> 0'
36
+ spec.add_development_dependency 'factory_girl', '~> 0'
37
+ spec.add_development_dependency 'pry', '~> 0'
35
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: make_model_searchable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - 8parth
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-11-15 00:00:00.000000000 Z
11
+ date: 2016-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,40 +16,54 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.0'
19
+ version: '4.0'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 3.0.0
22
+ version: 4.0.0
23
23
  type: :development
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '3.0'
29
+ version: '4.0'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 3.0.0
32
+ version: 4.0.0
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: activesupport
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '3.0'
39
+ version: '4.0'
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 3.0.0
42
+ version: 4.0.0
43
43
  type: :development
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: '3.0'
49
+ version: '4.0'
50
50
  - - ">="
51
51
  - !ruby/object:Gem::Version
52
- version: 3.0.0
52
+ version: 4.0.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: sqlite3
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
53
67
  - !ruby/object:Gem::Dependency
54
68
  name: bundler
55
69
  requirement: !ruby/object:Gem::Requirement
@@ -84,14 +98,42 @@ dependencies:
84
98
  requirements:
85
99
  - - "~>"
86
100
  - !ruby/object:Gem::Version
87
- version: '3.0'
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ - !ruby/object:Gem::Dependency
110
+ name: factory_girl
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ - !ruby/object:Gem::Dependency
124
+ name: pry
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
88
130
  type: :development
89
131
  prerelease: false
90
132
  version_requirements: !ruby/object:Gem::Requirement
91
133
  requirements:
92
134
  - - "~>"
93
135
  - !ruby/object:Gem::Version
94
- version: '3.0'
136
+ version: '0'
95
137
  description: Moduler solution to add search functionality for selected fields.
96
138
  email:
97
139
  - parthmodi54@yahoo.com