No release in over 3 years
Low commit activity in last 3 years
Bitfield value object for ActiveModel. No hidden definitions. No callbacks. Magicless.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
 Dependencies

Development

~> 1.6
>= 0
>= 0

Runtime

< 6, >= 4.0
< 6, >= 4.0
 Project Readme

BitfieldAttribute

Bitfield value object for ActiveModel. No hidden definitions. No callbacks. Magicless.

Build Status

Sponsored by Evil Martians

Installation

Add this line to your application's Gemfile:

gem 'bitfield_attribute'

And then execute:

$ bundle

Or install it yourself as:

$ gem install bitfield_attribute

Usage

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

ActiveModel I18n & forms

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'

Contributing

  1. Fork it ( https://github.com/gzigzigzeo/bitfield_attribute/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request