default_where 2.0.0 → 2.1.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: b6efeb771f8cfd12da8bd75a029ad32915b05965
4
- data.tar.gz: b93da85fe5ec94e864cf8b46ba3fdd54967207af
3
+ metadata.gz: bab39ef3d31eaf2792f44350e22cdc97ea35d3e3
4
+ data.tar.gz: fd311a5d219d7cf5b5ee6ecf5f3240fd9b79408c
5
5
  SHA512:
6
- metadata.gz: b64755c308fba999be677d7063137e92592bd33acdbfb0332b3dbc5c5d8b553918f118dfb1e961de08a9b4dd7034d4236549ca10f941eff734f4dd3b2e4d5720
7
- data.tar.gz: a9eab9b521f762795ba8508f8f97e6f132cc0c1fadb262285deec51febdb9fca7ba0c5a0df6b654e7cac2a3bad4efeaab2f1da9909770f3c36bcefae640217d7
6
+ metadata.gz: ae8a24b39eb7fa0a412139fb9e0be1506e9753c5c10969dbe169a4fe50c35c30b6973cfd1e9649f146ad2ad706d8351d0bfa479dc4a21d30e39d34e093c81f41
7
+ data.tar.gz: 46bc20372f0a1f118fe25ec723ab29d2b64f9c9e4568bbdd82ac7e46568848abcebcc8aada55e763a40e9cd72832bc3e8e7600bb9f0ee0e77607ef2ecf4c4829
data/README.md CHANGED
@@ -9,7 +9,7 @@ This Library set default params process for where query in ActiveRecord
9
9
  - Params:
10
10
 
11
11
  ```ruby
12
- # rails 4 and above, default_where does nothing
12
+ # rails 4 and later, default_where does nothing
13
13
  params = { role_id: 1, age: 20 }
14
14
  User.default_where(params)
15
15
  ```
@@ -20,6 +20,9 @@ User.default_where(params)
20
20
  ```ruby
21
21
  User.belongs_to :role
22
22
  params = { name: 'dhh', 'role.id': 2 }
23
+
24
+ # you can use any table name or reference name
25
+ params = { name: 'dhh', 'roles.id': 2 }
23
26
  ```
24
27
  - Before use `default_where`
25
28
  ```ruby
@@ -58,12 +61,15 @@ users = users.where(age: params[:age]) if params[:age]
58
61
  - After use `default_where`
59
62
  ```ruby
60
63
  User.default_where(params)
64
+
65
+ # also can control which blank value can use
66
+ User.default_where(params, { allow: [nil] })
61
67
  ```
62
68
 
63
69
  ### Order params
64
70
  - Params
65
71
  ```ruby
66
- params = { o1: 'age-asc', o2: 'last_login_at-asc' }
72
+ params = { 'age-asc': '1', 'last_login_at-asc': '2' }
67
73
  ```
68
74
  - Before use `default_where`
69
75
  ```ruby
@@ -77,7 +83,7 @@ User.default_where(params)
77
83
  ## A sample with all params above
78
84
  - Params
79
85
  ```ruby
80
- { name: 'dhh', 'role.id': 2, 'age-lte': 2, o1: 'age-asc', o2: 'last_login_at-asc' }
86
+ { name: 'dhh', 'role.id': 2, 'age-lte': 2, 'age-asc': '1', 'last_login_at-asc': '2' }
81
87
  ```
82
88
  - Before use `default_where`
83
89
  ```ruby
@@ -86,7 +92,4 @@ User.includes(:role).where(name: params[:name], 'roles.id': params[:'role.id']).
86
92
  - After use `default_where`
87
93
  ```ruby
88
94
  User.default_where(params)
89
- ```
90
-
91
- It will generate the query scope to above
92
- params must use string key
95
+ ```
data/lib/default_where.rb CHANGED
@@ -1,42 +1,43 @@
1
1
  require 'default_where/not'
2
2
  require 'default_where/range'
3
+ require 'default_where/like'
3
4
  require 'default_where/order'
4
5
 
5
6
  module DefaultWhere
6
7
  include DefaultWhere::Not
7
8
  include DefaultWhere::Range
8
9
  include DefaultWhere::Order
10
+ include DefaultWhere::Like
11
+
12
+ REJECT = ['', ' ', nil]
13
+
9
14
 
10
15
  def default_where(params = {}, options = {})
11
16
  return all if params.blank?
12
17
 
13
- params, tables = params_with_table(params, options)
18
+ params, refs, tables = params_with_table(params, options)
14
19
 
15
20
  range_params = filter_range(params)
16
- params = params.except!(*range_params.keys)
17
-
18
21
  order_params = filter_order(params)
19
- params = params.except!(*order_params.keys)
20
-
21
22
  not_params = filter_not(params)
22
- equal_params = params.except!(*not_params.keys)
23
+ like_params = filter_like(params)
24
+
25
+ equal_params = params.except!(*range_params.keys, *order_params.keys, *not_params.keys, *like_params.keys)
23
26
 
24
- includes(tables).where(equal_params).references(tables)
27
+ includes(refs).where(equal_params).references(tables)
25
28
  .not_scope(not_params)
29
+ .like_scope(like_params)
26
30
  .range_scope(range_params)
27
31
  .order_scope(order_params)
28
32
  end
29
33
 
30
34
  def params_with_table(params = {}, options = {})
31
- default_reject = ['', ' ', nil]
32
-
33
- if options[:allow_nil]
34
- default_reject.delete(nil)
35
- end
36
-
37
- # todo secure bug
38
- if params.respond_to?(:permitted?) && !params.permitted?
39
- params.permit!
35
+ if options[:reject]
36
+ default_reject = [options[:reject]].flatten
37
+ elsif options[:allow]
38
+ default_reject = REJECT - [options[:allow]].flatten
39
+ else
40
+ default_reject = REJECT
40
41
  end
41
42
 
42
43
  params = params.to_h
@@ -44,33 +45,36 @@ module DefaultWhere
44
45
  params.reject! { |_, value| default_reject.include?(value) }
45
46
 
46
47
  refs = []
48
+ tables = []
49
+ final_params = {}
47
50
 
48
- # since 1.9 is using lazy iteration
49
- params.to_a.each do |key, _|
50
-
51
+ params.each do |key, _|
51
52
  if key =~ /\./
52
- as, col = key.split('.')
53
+ table, col = key.split('.')
54
+ as_model = reflections[table]
53
55
  f_col, _ = col.split('-')
54
- as_model = reflections[as]
55
56
 
56
57
  if as_model && as_model.klass.column_names.include?(f_col)
57
- params["#{as_model.table_name}.#{col}"] = params.delete(key)
58
- refs << as.to_sym
59
- else
60
- params.delete(key)
58
+ final_params["#{as_model.table_name}.#{col}"] = params[key]
59
+ tables << as_model.table_name
60
+ refs << table.to_sym
61
+ elsif connection.data_sources.include? table
62
+ final_params["#{table}.#{col}"] = params[key]
63
+ tables << table
64
+ keys = reflections.select { |_, v| v.table_name == table }.keys
65
+ if keys && keys.size == 1
66
+ refs << keys.first.to_sym
67
+ end
61
68
  end
62
69
  else
63
70
  f_key, _ = key.split('-')
64
71
  if column_names.include?(f_key)
65
- params["#{table_name}.#{key}"] = params.delete(key)
66
- else
67
- params.delete(key)
72
+ final_params["#{table_name}.#{key}"] = params[key]
68
73
  end
69
74
  end
70
-
71
75
  end
72
76
 
73
- [params, refs]
77
+ [final_params, refs, tables]
74
78
  end
75
79
 
76
80
  end
@@ -0,0 +1,33 @@
1
+ module DefaultWhere
2
+ module Like
3
+
4
+ def like_scope(params)
5
+ where_string = []
6
+ where_hash = {}
7
+
8
+ params.select{ |k, _| k.end_with?('-like') }.each do |key, value|
9
+ real_key = key.sub(/-like$/, '')
10
+ agent_key = key.gsub(/[-\.]/, '_')
11
+
12
+ where_string << "#{real_key} like :#{agent_key}"
13
+ where_hash.merge! agent_key.to_sym => '%' + value.to_s + '%'
14
+ end
15
+
16
+ where_string = where_string.join ' AND '
17
+
18
+ if where_string.present?
19
+ condition = [where_string, where_hash]
20
+ where(condition)
21
+ else
22
+ all
23
+ end
24
+ end
25
+
26
+ def filter_like(params)
27
+ params.select do |k, _|
28
+ k.end_with?('-like')
29
+ end
30
+ end
31
+
32
+ end
33
+ end
@@ -5,11 +5,11 @@ module DefaultWhere
5
5
  order_array = []
6
6
 
7
7
  params.select{ |key, _| key.end_with?('-asc') }.each do |k, _|
8
- order_array << k.sub(/-asc$/, ' asc')
8
+ order_array << k.sub(/-asc$/, ' ASC')
9
9
  end
10
10
 
11
11
  params.select{ |key, _| key.end_with?('-desc') }.each do |k, _|
12
- order_array << k.sub(/-desc$/, ' desc')
12
+ order_array << k.sub(/-desc$/, ' DESC')
13
13
  end
14
14
 
15
15
  order(order_array)
@@ -17,7 +17,7 @@ module DefaultWhere
17
17
 
18
18
  def filter_order(params)
19
19
  params.select do |k, v|
20
- k =~ /o\d/ && v.end_with?('-asc', '-desc')
20
+ k.end_with?('-asc', '-desc') && v =~ /^[1-9]$/
21
21
  end
22
22
  end
23
23
 
@@ -9,7 +9,7 @@ module DefaultWhere
9
9
  }
10
10
 
11
11
  def range_scope(params)
12
- where_string = ''
12
+ where_string = []
13
13
  where_hash = {}
14
14
 
15
15
  PATTERN.each do |char, sign|
@@ -20,13 +20,13 @@ module DefaultWhere
20
20
  real_key = key.sub(exp, '')
21
21
  agent_key = key.gsub(/[-\.]/, '_')
22
22
 
23
- where_string << " AND #{real_key} #{sign} :#{agent_key}"
23
+ where_string << "#{real_key} #{sign} :#{agent_key}"
24
24
 
25
25
  where_hash.merge! agent_key.to_sym => value
26
26
  end
27
27
  end
28
28
 
29
- where_string.sub!(/^ AND /, '') if where_string.start_with?(' AND ')
29
+ where_string = where_string.join ' AND '
30
30
 
31
31
  if where_string.present?
32
32
  condition = [where_string, where_hash]
@@ -1,3 +1,3 @@
1
1
  module DefaultWhere
2
- VERSION = '2.0.0'
2
+ VERSION = '2.1.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: default_where
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - qinmingyuan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-13 00:00:00.000000000 Z
11
+ date: 2017-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -35,11 +35,11 @@ files:
35
35
  - README.md
36
36
  - Rakefile
37
37
  - lib/default_where.rb
38
+ - lib/default_where/like.rb
38
39
  - lib/default_where/not.rb
39
40
  - lib/default_where/order.rb
40
41
  - lib/default_where/range.rb
41
42
  - lib/default_where/version.rb
42
- - lib/tasks/query_scope_tasks.rake
43
43
  - test/default_where_test.rb
44
44
  - test/test_helper.rb
45
45
  homepage: https://github.com/qinmingyuan/default_where
@@ -62,7 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
62
  version: '0'
63
63
  requirements: []
64
64
  rubyforge_project:
65
- rubygems_version: 2.6.4
65
+ rubygems_version: 2.6.11
66
66
  signing_key:
67
67
  specification_version: 4
68
68
  summary: default process params for where
@@ -1,4 +0,0 @@
1
- # desc "Explaining what the task does"
2
- # task :query_scope do
3
- # # Task goes here
4
- # end