make_model_searchable 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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