All Projects → wittydeveloper → Attr_bitwise

wittydeveloper / Attr_bitwise

Licence: mit
Bitwise attribute for ruby class and Rails model

Programming Languages

ruby
36898 projects - #4 most used programming language

⚠️ NOT MAINTAINED ⚠️

attr_bitwise https://circleci.com/gh/wittydeveloper/attr_bitwise.png?circle-token=7f58370c3b13faaf1954b9e8fe6c7b1fb329daf2 Gem Version

Bitwise attribute for ruby class and Rails model

Features

  • bitwise attribute + helpers, useful for storing multiple states in one place
  • ActiveRecord compatible

Please read this article for some concrete examples

Install

Inline

  • gem install attr_bitwise

Gemfile

  • gem 'attr_bitwise'

Usage

attr_bitwise :<name>, mapping: <values_sym> [, column_name: <column_name>]

Alternatively, you can explicitly specify your states by supplying a hash with the values.

attr_bitwise :<name>, mapping: {<sym1: 1, sym2: 2, sym3: 4>} [, column_name: <column_name>]

Example

You have a website with many locales (English, French, German...) with specific content in each locale. You want your users to be able to chose which content they want to see and you want to be able to query the users by the locales they have chosen.

Start with migration

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      # [...]
      t.integer :locales_value
    end
  end
end

Model

class User < ActiveRecord::Base
  include AttrBitwise

  attr_bitwise :locales, mapping: [:en, :fr, :de]

  scope :with_any_locales, lambda { |*locales_sym|
    where(locales_value: bitwise_union(*locales_sym, 'locales'))
  }

  scope :with_all_locales, lambda { |*locales_sym|
    where(locales_value: bitwise_intersection(*locales_sym, 'locales'))
  }

end

###

# return all users who can see at least english or french content
User.with_any_locales(:en, :fr)

# return all users who can see english and french content
User.with_all_locales(:en, :fr)

API

Examples with name = 'locales'

High level methods

Method Return Description
Class#locales [, ...] Return values as symbols
Class#locales=([value_or_sym, ..]) [, ...] Given an array of values (Fixnum or Symbol) or single value (Fixnum or Symbol) add them to value.
Class#locale == fixnum_or_sym Boolean Return true if value contains only Fixnum or Symbol
Class#locale?(fixnum_or_sym) Boolean Return true if value contains Fixnum or Symbol
Class#add_locale(value_or_sym) Fixnum Add Fixnum or Symbol to value
Class#remove_locale(value_or_sym) Fixnum Remove Fixnum or Symbol to value
Class#locales_union([value_or_sym, ..]) [Fixnum, ..] Given an array of values (Fixnum or Symbol), return bitwise union computation
Return all possible values (mask) for an union of given values
Class#locales_intersection([value_or_sym, ..]) [Fixnum, ..] Given an array of values (Fixnum or Symbol), return bitwise intersection computation
Return all possible values (mask) for an intersection of given values
Class::LOCALES_MAPPING Hash Return Symbol -> Fixnum mapping

Low level methods

Theses methods are static, so a name parameters is mandatory in order to fetch mapping

Method Return Description
Class.to_bitwise_values(object, name) [Fixnum, ...] Given an Object and a attribute name, return Fixnum value depending on mapping
Class.bitwise_union([Fixnum, ..], name) [Fixnum, ..] Given an array of values (Fixnum or Symbol) and a attribute name, return bitwise union computation
Return all possible values (mask) for an union of given values
Class.bitwise_intersection([Fixnum, ..], name) [Fixnum, ..] Given an array of values (Fixnum or Symbol) and a attribute name, return bitwise intersection computation
Return all possible values (mask) for an intersection of given values

Maintainers : @wittydeveloper and @FSevaistre

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].