module BitfieldFlags

Constants

VERSION

Attributes

bitfield_flags[RW]

Public Class Methods

bitval_for(*flags, column_name: :flags) click to toggle source
# File lib/bitfield_flags.rb, line 34
def bitval_for(*flags, column_name: :flags)
  flags.inject(0) { |bitval, flag| bitval | bitfield_flags[column_name][flag] }
end
flag_not_set(*flags, column_name: :flags)
Alias for: flags_not_set
flag_set(*flags, column_name: :flags)
Alias for: flags_set
flags_not_set(*flags, column_name: :flags) click to toggle source
# File lib/bitfield_flags.rb, line 29
def flags_not_set(*flags, column_name: :flags)
  "(#{column_name} & #{bitval_for(*flags, column_name: column_name)}) = 0"
end
Also aliased as: flag_not_set
flags_set(*flags, column_name: :flags) click to toggle source
# File lib/bitfield_flags.rb, line 24
def flags_set(*flags, column_name: :flags)
  "(#{column_name} & #{bitval_for(*flags, column_name: column_name)}) != 0"
end
Also aliased as: flag_set
included(base) click to toggle source
# File lib/bitfield_flags.rb, line 5
def self.included(base)
  base.class_eval do
    include Bitfields

    class << self
      attr_accessor :bitfield_flags

      # set up bitfield with scopes for the given names
      def scoped_flags(flag_names, column_name = :flags)
        self.bitfield_flags ||= {}
        self.bitfield_flags[column_name] = flag_names.each_with_object({}) { |f, h| h[f.to_sym] = (1 << flag_names.index(f)) }
        bitfield column_name, bitfield_flags[column_name].invert.merge(scopes: false)

        bitfield_flags[column_name].keys.each do |flag|
          scope flag,                 -> { where(flag_set(flag, column_name: column_name)) }
          scope "not_#{flag}".to_sym, -> { where(flag_not_set(flag, column_name: column_name)) }
        end
      end

      def flags_set(*flags, column_name: :flags)
        "(#{column_name} & #{bitval_for(*flags, column_name: column_name)}) != 0"
      end
      alias_method :flag_set, :flags_set

      def flags_not_set(*flags, column_name: :flags)
        "(#{column_name} & #{bitval_for(*flags, column_name: column_name)}) = 0"
      end
      alias_method :flag_not_set, :flags_not_set

      def bitval_for(*flags, column_name: :flags)
        flags.inject(0) { |bitval, flag| bitval | bitfield_flags[column_name][flag] }
      end
    end

  end
end
scoped_flags(flag_names, column_name = :flags) click to toggle source

set up bitfield with scopes for the given names

# File lib/bitfield_flags.rb, line 13
def scoped_flags(flag_names, column_name = :flags)
  self.bitfield_flags ||= {}
  self.bitfield_flags[column_name] = flag_names.each_with_object({}) { |f, h| h[f.to_sym] = (1 << flag_names.index(f)) }
  bitfield column_name, bitfield_flags[column_name].invert.merge(scopes: false)

  bitfield_flags[column_name].keys.each do |flag|
    scope flag,                 -> { where(flag_set(flag, column_name: column_name)) }
    scope "not_#{flag}".to_sym, -> { where(flag_not_set(flag, column_name: column_name)) }
  end
end