active_flag 1.5.2 → 1.6.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
  SHA256:
3
- metadata.gz: 2138875041460aa14daf08205e785d254a98de7480493ba02384b0e7532e46ec
4
- data.tar.gz: 2d73e184d76e622527418ee6f7d631d94af443d0e64af90784d57e924eee7377
3
+ metadata.gz: 2410c1b0af6f52df6e74bbbb1dee7f4aa445d7914ec9f63caffc843a4f8453a0
4
+ data.tar.gz: b4877beab21724bf362fe26fdeb3e3d7d9de532170a46acf638dcad36df15d09
5
5
  SHA512:
6
- metadata.gz: d3df91d0240c5974605780a6a20adfbe251421b85232c12fd422bd222f42e5822cb4896aeb08ea6c9e0103cc451c80d6018a1dd0ef1eec4f43f19fc21b4890fd
7
- data.tar.gz: 455b9ed794b025f0c05235f6163053938565c3762f053469a0c9f3855de83918460bced3b28ebfaa56f2ca77fc41f996ed114fe10e7f99b003a484d7f23e0682
6
+ metadata.gz: 84efcd90ecdc82c0e93074902a8bee8f88fb114035a1680808b1f53840e8224388d372872aa3d3d392ad4c36bd0bc5301d48eba21adb5a275b869c5b90d3098f
7
+ data.tar.gz: 721d7dec4c58f396427bb50dfa4c577bf9aa23bfb871c27f4da8b1d20a9d1aa026e2ec163bdf58927548a4c28ff8f389008fb639d58f8b23f3d3c38c7fb68004
data/README.md CHANGED
@@ -43,6 +43,9 @@ Profile.languages.to_array(3) #=> [:english, :spanish]
43
43
 
44
44
  # Scope methods
45
45
  Profile.where_languages(:french, :spanish) #=> SELECT * FROM profiles WHERE languages & 10 > 0
46
+ Profile.where_all_languages(:french, :spanish) #=> SELECT * FROM profiles WHERE languages & 10 = 10
47
+ Profile.where_not_languages(:french, :spanish) #=> SELECT * FROM profiles WHERE languages & 10 = 0
48
+ Profile.where_not_all_languages(:french, :spanish) #=> SELECT * FROM profiles WHERE languages & 10 < 10
46
49
  Profile.languages.set_all!(:chinese) #=> UPDATE "profiles" SET languages = COALESCE(languages, 0) | 4
47
50
  Profile.languages.unset_all!(:chinese) #=> UPDATE "profiles" SET languages = COALESCE(languages, 0) & ~4
48
51
  ```
@@ -67,7 +70,8 @@ add_column :users, :languages, :integer, null: false, default: 0, limit: 8
67
70
 
68
71
  ## Query
69
72
 
70
- For a querying purpose, use `where_[column]` scope.
73
+ For a querying purpose, use `where_[column]`, `where_all_[column]`,
74
+ `where_not_[column]` and `where_not_all_[column]` scopes.
71
75
 
72
76
  ```ruby
73
77
  Profile.where_languages(:french) #=> SELECT * FROM profiles WHERE languages & 8 > 0
@@ -79,12 +83,24 @@ Also takes multiple values.
79
83
  Profile.where_languages(:french, :spanish) #=> SELECT * FROM profiles WHERE languages & 10 > 0
80
84
  ```
81
85
 
82
- By default, it searches with `or` operation, so the query above returns profiles that have either French or Spanish.
86
+ By default, it returns profiles that have either French or Spanish.
83
87
 
84
- If you want to change it to `and` operation, you can specify:
88
+ To get profiles that have both French and Spanish, use:
85
89
 
86
90
  ```ruby
87
- Profile.where_languages(:french, :spanish, op: :and) #=> SELECT * FROM profiles WHERE languages = 10
91
+ Profile.where_all_languages(:french, :spanish) #=> SELECT * FROM profiles WHERE languages & 10 = 10
92
+ ```
93
+
94
+ To get profiles that do not have either French or Spanish, use:
95
+
96
+ ```ruby
97
+ Profile.where_not_languages(:french, :spanish) #=> SELECT * FROM profiles WHERE languages & 10 = 0
98
+ ```
99
+
100
+ To get profiles that do not have both French and Spanish, use:
101
+
102
+ ```ruby
103
+ Profile.where_not_all_languages(:french, :spanish) #=> SELECT * FROM profiles WHERE languages & 10 < 10
88
104
  ```
89
105
 
90
106
  ## Translation
@@ -1,3 +1,3 @@
1
1
  module ActiveFlag
2
- VERSION = '1.5.2'
2
+ VERSION = '1.6.0'
3
3
  end
data/lib/active_flag.rb CHANGED
@@ -35,15 +35,37 @@ module ActiveFlag
35
35
 
36
36
  # Scopes
37
37
  define_singleton_method "where_#{column}" do |*args|
38
- options = args.extract_options!
39
- integer = active_flags[column].to_i(args)
40
- column_name = connection.quote_table_name_for_assignment(table_name, column)
38
+ options, integer, column_name = send "_where_#{column}", *args
41
39
  if options[:op] == :and
40
+ ActiveSupport::Deprecation.warn('op: :and is deprecated, use where_all instead')
42
41
  where("#{column_name} & #{integer} = #{integer}")
43
42
  else
44
43
  where("#{column_name} & #{integer} > 0")
45
44
  end
46
45
  end
46
+
47
+ define_singleton_method "where_all_#{column}" do |*args|
48
+ _options, integer, column_name = send "_where_#{column}", *args
49
+ where("#{column_name} & #{integer} = #{integer}")
50
+ end
51
+
52
+ define_singleton_method "where_not_#{column}" do |*args|
53
+ _options, integer, column_name = send "_where_#{column}", *args
54
+ where("#{column_name} & #{integer} = 0")
55
+ end
56
+
57
+ define_singleton_method "where_not_all_#{column}" do |*args|
58
+ _options, integer, column_name = send "_where_#{column}", *args
59
+ where("#{column_name} & #{integer} < #{integer}")
60
+ end
61
+
62
+ define_singleton_method "_where_#{column}" do |*args|
63
+ return [
64
+ args.extract_options!,
65
+ active_flags[column].to_i(args),
66
+ connection.quote_table_name_for_assignment(table_name, column)
67
+ ]
68
+ end
47
69
  end
48
70
  end
49
71
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_flag
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.2
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenn Ejima
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-30 00:00:00.000000000 Z
11
+ date: 2022-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord