bitfields 0.5.0 → 0.5.1
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 +4 -4
- data/Readme.md +13 -13
- data/lib/bitfields.rb +6 -0
- data/lib/bitfields/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 08330b3abc50142d13e76b375850bf801e726a62
|
4
|
+
data.tar.gz: 7e8000377a4d47a4c58efeb407f49ab416878e47
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83a8a21cc1fb2507d5985c3b88eb88c61a0cfe91d75e18536eab8626bd864d2a8d658e75a2b64b547e9ba81c74dfa7c701f9cfaf4c17671ab147fb50a4c80bc8
|
7
|
+
data.tar.gz: 217bd3fca492ccdfac286537c5f228bb08c9ecacdbe6ce6dc1c0e767ca4ae1d4976b392a74eed737907e9c3d12cefd61331a3ce67240080a190d3a7ca5c8aebc
|
data/Readme.md
CHANGED
@@ -7,17 +7,17 @@ class User < ActiveRecord::Base
|
|
7
7
|
bitfield :my_bits, 1 => :seller, 2 => :insane, 4 => :stupid
|
8
8
|
end
|
9
9
|
|
10
|
-
user = User.new(:
|
10
|
+
user = User.new(foo: true, insane: true)
|
11
11
|
user.seller == true
|
12
12
|
user.stupid? == false
|
13
13
|
user.my_bits == 3
|
14
14
|
```
|
15
15
|
|
16
|
-
- records
|
17
|
-
- adds scopes `User.
|
18
|
-
- builds sql `User.bitfield_sql(:
|
19
|
-
- builds index-using sql with `bitfield ...
|
20
|
-
- builds update sql `User.set_bitfield_sql(:
|
16
|
+
- records bitfield_changes `user.bitfield_changes == {foo: [false, true]}` (also `foo_was` / `foo_change` / `foo_changed?`)
|
17
|
+
- adds scopes `User.foo.stupid.first` (deactivate with `bitfield ..., scopes: false`)
|
18
|
+
- builds sql `User.bitfield_sql(insane: true, stupid: false) == '(users.my_bits & 3) = 1'`
|
19
|
+
- builds index-using sql with `bitfield ... , query_mode: :in_list` and `User.bitfield_sql(insane: true, stupid: false) == 'users.my_bits IN (2, 3)'` (2 and 1+2), often slower than :bit_operator sql especially for high number of bits
|
20
|
+
- builds update sql `User.set_bitfield_sql(insane: true, stupid: false) == 'my_bits = (my_bits | 6) - 4'`
|
21
21
|
- **faster sql than any other bitfield lib** through combination of multiple bits into a single sql statement
|
22
22
|
- gives access to bits `User.bitfields[:my_bits][:stupid] == 4`
|
23
23
|
|
@@ -32,9 +32,9 @@ gem install bitfields
|
|
32
32
|
ALWAYS set a default, bitfield queries will not work for NULL
|
33
33
|
|
34
34
|
```ruby
|
35
|
-
t.integer :my_bits, :
|
35
|
+
t.integer :my_bits, default: 0, null: false
|
36
36
|
# OR
|
37
|
-
add_column :users, :my_bits, :integer, :
|
37
|
+
add_column :users, :my_bits, :integer, default: 0, null: false
|
38
38
|
```
|
39
39
|
|
40
40
|
Examples
|
@@ -42,13 +42,13 @@ Examples
|
|
42
42
|
Update all users
|
43
43
|
|
44
44
|
```ruby
|
45
|
-
User.seller.not_stupid.update_all(User.set_bitfield_sql(:
|
45
|
+
User.seller.not_stupid.update_all(User.set_bitfield_sql(seller: true, insane: true))
|
46
46
|
```
|
47
47
|
|
48
48
|
Delete the shop when a user is no longer a seller
|
49
49
|
|
50
50
|
```ruby
|
51
|
-
before_save :delete_shop, :
|
51
|
+
before_save :delete_shop, if: -> { |u| u.seller_change == [true, false]}
|
52
52
|
```
|
53
53
|
|
54
54
|
TIPS
|
@@ -56,14 +56,14 @@ TIPS
|
|
56
56
|
- [Upgrading] in version 0.2.2 the first field(when not given as hash) used bit 2 -> add a bogus field in first position
|
57
57
|
- [Defaults] afaik it is not possible to have some bits true by default (without monkeypatching AR/see [tests](https://github.com/grosser/bitfields/commit/2170dc546e2c4f1187089909a80e8602631d0796)) -> choose a good naming like `xxx_on` / `xxx_off` to use the default 'false'
|
58
58
|
- Never do: "#{bitfield_sql(...)} AND #{bitfield_sql(...)}", merge both into one hash
|
59
|
-
- bit_operator is faster in most cases, use :
|
59
|
+
- bit_operator is faster in most cases, use query_mode: :in_list sparingly
|
60
60
|
- Standard mysql integer is 4 byte -> 32 bitfields
|
61
61
|
- If you are lazy or bad at math you can also do `bitfields :bits, :foo, :bar, :baz`
|
62
62
|
- If you are want more readability and reduce clutter you can do `bitfields 2**0 => :foo, 2**1 => :bar, 2**32 => :baz`
|
63
63
|
|
64
64
|
Query-mode Benchmark
|
65
65
|
=========
|
66
|
-
The
|
66
|
+
The `query_mode: :in_list` is slower for most queries and scales mierably with the number of bits.<br/>
|
67
67
|
*Stay with the default query-mode*. Only use :in_list if your edge-case shows better performance.
|
68
68
|
|
69
69
|

|
@@ -83,7 +83,7 @@ end
|
|
83
83
|
|
84
84
|
TODO
|
85
85
|
====
|
86
|
-
- convenient named scope `User.with_bitfields(:
|
86
|
+
- convenient named scope `User.with_bitfields(xxx: true, yyy: false)`
|
87
87
|
|
88
88
|
Authors
|
89
89
|
=======
|
data/lib/bitfields.rb
CHANGED
@@ -84,6 +84,12 @@ module Bitfields
|
|
84
84
|
define_method(bit_name) { bitfield_value(bit_name) }
|
85
85
|
define_method("#{bit_name}?") { bitfield_value(bit_name) }
|
86
86
|
define_method("#{bit_name}=") { |value| set_bitfield_value(bit_name, value) }
|
87
|
+
define_method("#{bit_name}_was") { bitfield_value_was(bit_name) }
|
88
|
+
define_method("#{bit_name}_changed?") { bitfield_value_was(bit_name) != bitfield_value(bit_name) }
|
89
|
+
define_method("#{bit_name}_change") do
|
90
|
+
values = [bitfield_value_was(bit_name), bitfield_value(bit_name)]
|
91
|
+
values unless values[0] == values[1]
|
92
|
+
end
|
87
93
|
|
88
94
|
if options[:scopes] != false
|
89
95
|
scope bit_name, bitfield_scope_options(bit_name => true)
|
data/lib/bitfields/version.rb
CHANGED