module BitwiseAttribute::ClassMethods
Public Instance Methods
attr_bitwise(name, values:, column_name: nil)
click to toggle source
# File lib/bitwise_attribute.rb, line 19 def attr_bitwise(name, values:, column_name: nil) column_name ||= "#{name.to_s.singularize}_mask" mapping = build_mapping(values) define_class_methods(name, column_name, mapping) define_instance_methods(name, column_name, mapping) end
Private Instance Methods
build_mapping(values)
click to toggle source
Builds internal bitwise key-value mapping it add a zero value, needed for bits operations. Each sym get a power of 2 value
# File lib/bitwise_attribute.rb, line 60 def build_mapping(values) {}.tap do |hash| values.each_with_index { |key, index| hash[key] = (0b1 << index) } end end
define_class_methods(name, column_name, mapping)
click to toggle source
# File lib/bitwise_attribute.rb, line 30 def define_class_methods(name, column_name, mapping) define_singleton_method(name) do mapping end define_named_scopes(name, column_name, mapping) if defined?(ActiveRecord) end
define_instance_methods(name, column_name, mapping)
click to toggle source
# File lib/bitwise_attribute.rb, line 38 def define_instance_methods(name, column_name, mapping) define_method(name) do roles = value_getter(column_name, mapping) # This special array will call self.<name>= after changed ValuesList.new(name, self, roles) end define_method("#{name}=") do |new_values| value_setter(column_name, Array(new_values), mapping) end # Adds a boolean method for each key (ex: admin?) mapping.each_key do |key| define_method("#{key}?") do value?(column_name, mapping[key]) end end end