pjb3-has-bit-field 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +6 -2
- data/VERSION +1 -1
- data/has-bit-field.gemspec +1 -1
- data/lib/has-bit-field.rb +6 -6
- data/test/has-bit-field_test.rb +4 -4
- metadata +1 -1
data/README.md
CHANGED
@@ -13,7 +13,7 @@ Now in one of your models, you define a bit field like this:
|
|
13
13
|
has_bit_field :bit_field, :likes_ice_cream, :plays_golf, :watches_tv, :reads_books
|
14
14
|
end
|
15
15
|
|
16
|
-
This means that your database will have an integer column called `bit_field` which will hold the actual bit field. This will generate getter and setter methods for each of the fields. You can use it like this:
|
16
|
+
This means that your database will have an integer column called `bit_field` which will hold the actual bit field. This will generate getter and setter methods for each of the fields. It will also generate a method that has `_bit` as a suffix which will give you the decimal value of the bit that that field is represented by in the bit field. Also there will be a named scope for that field, as well as a named scope prefixed with `not_`, if class you are adding the bit field to responds to `named_scope`. You can use it like this:
|
17
17
|
|
18
18
|
$ script/console
|
19
19
|
Loading development environment (Rails 2.3.2)
|
@@ -31,7 +31,11 @@ This means that your database will have an integer column called `bit_field` whi
|
|
31
31
|
=> true
|
32
32
|
>> p.reads_books?
|
33
33
|
=> false
|
34
|
-
|
34
|
+
>> Person.plays_golf_bit
|
35
|
+
=> 4
|
36
|
+
>> p = Person.likes_ice_cream.first
|
37
|
+
=> #<Person id: 1, bit_field: 3, created_at: "2009-07-18 03:04:06", updated_at: "2009-07-18 03:04:06">
|
38
|
+
|
35
39
|
|
36
40
|
Copyright
|
37
41
|
---------
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.1
|
data/has-bit-field.gemspec
CHANGED
data/lib/has-bit-field.rb
CHANGED
@@ -5,25 +5,25 @@ module HasBitField
|
|
5
5
|
# which will be the name of each flag in the bit field
|
6
6
|
def has_bit_field(bit_field_attribute, *args)
|
7
7
|
args.each_with_index do |field,i|
|
8
|
-
define_method
|
8
|
+
(class << self; self end).send(:define_method, "#{field}_bit") do
|
9
9
|
(1 << i)
|
10
10
|
end
|
11
11
|
define_method(field) do
|
12
|
-
(send(bit_field_attribute) & send("#{field}_bit")) != 0
|
12
|
+
(send(bit_field_attribute) & self.class.send("#{field}_bit")) != 0
|
13
13
|
end
|
14
14
|
define_method("#{field}?") do
|
15
15
|
send(field)
|
16
16
|
end
|
17
17
|
define_method("#{field}=") do |v|
|
18
18
|
if v.to_s == "true" || v.to_s == "1"
|
19
|
-
send("#{bit_field_attribute}=", ((send(bit_field_attribute) || 0) | send("#{field}_bit")))
|
19
|
+
send("#{bit_field_attribute}=", ((send(bit_field_attribute) || 0) | self.class.send("#{field}_bit")))
|
20
20
|
else
|
21
|
-
send("#{bit_field_attribute}=", ((send(bit_field_attribute) || 0) & ~send("#{field}_bit")))
|
21
|
+
send("#{bit_field_attribute}=", ((send(bit_field_attribute) || 0) & ~self.class.send("#{field}_bit")))
|
22
22
|
end
|
23
23
|
end
|
24
24
|
if(respond_to?(:named_scope))
|
25
|
-
named_scope field, :conditions => ["(#{table_name}.#{bit_field_attribute} & ?) != 0", (
|
26
|
-
named_scope "not_#{field}", :conditions => ["(#{table_name}.#{bit_field_attribute} & ?) = 0", (
|
25
|
+
named_scope field, :conditions => ["(#{table_name}.#{bit_field_attribute} & ?) != 0", send("#{field}_bit")]
|
26
|
+
named_scope "not_#{field}", :conditions => ["(#{table_name}.#{bit_field_attribute} & ?) = 0", send("#{field}_bit")]
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
data/test/has-bit-field_test.rb
CHANGED
@@ -29,10 +29,10 @@ class HasBitFieldTest < Test::Unit::TestCase
|
|
29
29
|
assert p.respond_to?("#{f}="), "Expected #{p.inspect} to respond to #{f}="
|
30
30
|
end
|
31
31
|
|
32
|
-
assert_equal
|
33
|
-
assert_equal
|
34
|
-
assert_equal
|
35
|
-
assert_equal
|
32
|
+
assert_equal Person.likes_ice_cream_bit, (1 << 0)
|
33
|
+
assert_equal Person.plays_golf_bit, (1 << 1)
|
34
|
+
assert_equal Person.watches_tv_bit, (1 << 2)
|
35
|
+
assert_equal Person.reads_books_bit, (1 << 3)
|
36
36
|
|
37
37
|
p.likes_ice_cream = true
|
38
38
|
assert p.likes_ice_cream?
|