active_flag 1.5.2 → 1.6.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
  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