has-bit-field 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.rvmrc CHANGED
@@ -1,2 +1 @@
1
- rvm_gemset_create_on_use_flag=1
2
- rvm gemset use has-bit-field
1
+ rvm ree@has-bit-field --create
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- has-bit-field (1.0.0)
4
+ has-bit-field (1.1.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/README.md CHANGED
@@ -3,13 +3,22 @@ has-bit-field
3
3
 
4
4
  has-bit-field allows you to use one attribute of an object to store a bit field which stores the boolean state for multiple flags.
5
5
 
6
+ **Rails 3.0.x**
7
+
8
+ Add the gem to your Gemfile.
9
+
10
+ gem 'has-bit-field'
11
+
12
+ **Rails 2.3.x**
13
+
6
14
  To use this with Active Record, you would first require this gem in `config/environment.rb`:
7
15
 
8
- config.gem "pjb3-has-bit-field", :lib => "has-bit-field", :source => "http://gems.github.com"
16
+ config.gem "has-bit-field"
9
17
 
10
18
  Now in one of your models, you define a bit field like this:
11
19
 
12
20
  class Person < ActiveRecord::Base
21
+ extend HasBitField
13
22
  has_bit_field :bit_field, :likes_ice_cream, :plays_golf, :watches_tv, :reads_books
14
23
  end
15
24
 
@@ -39,6 +48,7 @@ This means that your database will have an integer column called `bit_field` whi
39
48
  One of the great advantages of this approach is that it is easy to add additional flags as your application evolves without the overhead of adding new table columns since a single integer will be able to store at least 31 boolean flags. A simple amendment to the model will create the new flag on the existing integer column 'on-the-fly'. However, the order of the flags is vitally important and you should only ever add new flags on the end.
40
49
 
41
50
  class Person < ActiveRecord::Base
51
+ extend HasBitField
42
52
  has_bit_field :bit_field, :likes_ice_cream, :plays_golf, :watches_tv, :reads_books, :nut_allergy
43
53
  end
44
54
 
@@ -47,6 +57,7 @@ The new flag will be evaluated as false for existing rows on the database table
47
57
  Another gotcha to be aware of is when combining a bit field with Active Record's `validates_acceptance_of`. When you call `validates_acceptance_of`, if there is no database column, Active Record will define an `attr_accessor` for that boolean field. If you have already defined the bit field, this will clobber those methods. Also, you need to set the value it's looking for to `true` instead of the default of `"1"`. So here's an example of how to use it:
48
58
 
49
59
  class Person < ActiveRecord::Base
60
+ extend HasBitField
50
61
  validates_acceptance_of :read_books, :message => "You must agree to read", :accept => true
51
62
  has_bit_field :bit_field, :likes_ice_cream, :plays_golf, :watches_tv, :reads_books
52
63
  end
data/lib/has-bit-field.rb CHANGED
@@ -34,19 +34,21 @@ module HasBitField
34
34
  #{field} != #{field}_was
35
35
  end
36
36
  }
37
- if(respond_to?(:named_scope))
38
- if columns_hash[bit_field_attribute.to_s].null
39
- class_eval %{
40
- named_scope :#{field}, :conditions => ["#{table_name}.#{bit_field_attribute} IS NOT NULL AND (#{table_name}.#{bit_field_attribute} & ?) != 0", #{field}_bit]
41
- named_scope :not_#{field}, :conditions => ["#{table_name}.#{bit_field_attribute} IS NULL OR (#{table_name}.#{bit_field_attribute} & ?) = 0", #{field}_bit]
42
- }
43
- else
44
- class_eval %{
45
- named_scope :#{field}, :conditions => ["(#{table_name}.#{bit_field_attribute} & ?) != 0", #{field}_bit]
46
- named_scope :not_#{field}, :conditions => ["(#{table_name}.#{bit_field_attribute} & ?) = 0", #{field}_bit]
47
- }
48
- end
37
+
38
+ scope_sym = respond_to?(:validates) ? :scope : :named_scope
39
+
40
+ if columns_hash[bit_field_attribute.to_s].null
41
+ class_eval %{
42
+ send scope_sym, :#{field}, :conditions => ["#{table_name}.#{bit_field_attribute} IS NOT NULL AND (#{table_name}.#{bit_field_attribute} & ?) != 0", #{field}_bit]
43
+ send scope_sym, :not_#{field}, :conditions => ["#{table_name}.#{bit_field_attribute} IS NULL OR (#{table_name}.#{bit_field_attribute} & ?) = 0", #{field}_bit]
44
+ }
45
+ else
46
+ class_eval %{
47
+ send scope_sym, :#{field}, :conditions => ["(#{table_name}.#{bit_field_attribute} & ?) != 0", #{field}_bit]
48
+ send scope_sym, :not_#{field}, :conditions => ["(#{table_name}.#{bit_field_attribute} & ?) = 0", #{field}_bit]
49
+ }
49
50
  end
51
+
50
52
  end
51
53
  end
52
54
  end
@@ -1,7 +1,7 @@
1
1
  module Has
2
2
  module Bit
3
3
  module Field
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.0"
5
5
  end
6
6
  end
7
7
  end
@@ -178,7 +178,7 @@ class HasBitFieldTest < Test::Unit::TestCase
178
178
  s.chops_trees = true
179
179
  assert s.chops_trees?
180
180
  assert s.valid?
181
- assert !s.errors[:chops_trees]
181
+ assert s.errors[:chops_trees].blank?
182
182
  assert s.save
183
183
  end
184
184
 
@@ -202,7 +202,7 @@ class HasBitFieldTest < Test::Unit::TestCase
202
202
  s.plays_piano = true
203
203
  assert s.plays_piano?
204
204
  assert s.valid?
205
- assert !s.errors[:plays_piano]
205
+ assert s.errors[:plays_piano].blank?
206
206
  assert s.save
207
207
  end
208
208
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: has-bit-field
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease: false
4
+ hash: 19
5
+ prerelease:
6
6
  segments:
7
7
  - 1
8
+ - 1
8
9
  - 0
9
- - 0
10
- version: 1.0.0
10
+ version: 1.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Paul Barry
@@ -15,8 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-23 00:00:00 -05:00
19
- default_executable:
18
+ date: 2012-05-17 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: sqlite3-ruby
@@ -72,7 +71,6 @@ files:
72
71
  - rails/init.rb
73
72
  - test/has-bit-field_test.rb
74
73
  - test/test_helper.rb
75
- has_rdoc: true
76
74
  homepage: http://github.com/pjb3/has-bit-field
77
75
  licenses: []
78
76
 
@@ -102,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
100
  requirements: []
103
101
 
104
102
  rubyforge_project: has-bit-field
105
- rubygems_version: 1.3.7
103
+ rubygems_version: 1.8.17
106
104
  signing_key:
107
105
  specification_version: 3
108
106
  summary: Provides an easy way to work with bit fields in active record