default_where 2.0.0 → 2.1.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: 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