Bitfield value object for ActiveModel. No hidden definitions. No callbacks. Magicless.
Add this line to your application's Gemfile:
gem 'bitfield_attribute'
And then execute:
$ bundle
Or install it yourself as:
$ gem install bitfield_attribute
Add integer column to your model:
class AddNotificationSettingsToUsers < ActiveRecord::Migration
def change
add_column :users, :notification_settings, :integer, default: 0
end
end
Define bitfield class:
class User::NotificationSettings
include BitfieldAttribute::Base
define_bits :weekly_digest, :announces, :events
end
Define accessor in the model:
class User < ActiveRecord::Base
def notification_settings
@notification_settings ||= User::NotificationSettings.new(self, :notification_settings)
end
def notification_settings=(value)
notification_settings.attributes = value
end
end
Use it:
user = User.new(notification_settings: {weekly_digest: true})
user.notification_settings.announces = true
user.notification_settings.weekly_digest? # => true
user.notification_settings.to_a # => [:weekly_digest, :announces]
user.notification_settings.attributes # => { weekly_digest: true, announces: true, events: false }
user[:notification_settings] # => 3
Modify your bitfield class:
class User::NotificationSettings
include BitfieldAttribute::Base
extend ActiveModel::Naming
extend ActiveModel::Translation
define_bits :weekly_digest, :announces, :events
end
Add this to your locale file:
en:
activemodel:
attributes:
"user/notification_settings":
weekly_digest: 'Weekly top sellers digest'
announces: 'Announces'
events: 'Invitations'
Use forms:
= form_for @user do |form|
= form.fields_for :notification_settings, form.object.notification_settings do |f|
= f.check_box :weekly_digest
= f.label :weekly_digest
...
= form.submit 'Save'
- Fork it ( https://github.com/gzigzigzeo/bitfield_attribute/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request