module SimpleFlaggableColumn::ClassMethods

Public Instance Methods

flag_column(name, symbols_flags, options = {}) click to toggle source
# File lib/simple_flaggable_column.rb, line 21
def flag_column(name, symbols_flags, options = {})
  options = {
    throw_on_missing: true
  }.merge(options)

  flags_symbols = symbols_flags.invert

  define_singleton_method :"#{name}_flags" do |*symbols|
    if symbols.empty?
      symbols_flags
    else
      SimpleFlaggableColumn.symbols_to_flags(
        symbols,
        symbols_flags,
        options[:throw_on_missing]
      )
    end
  end

  define_singleton_method :"flags_#{name}" do
    flags_symbols
  end

  define_method "#{name}=" do |symbols|
    if symbols.nil?
      write_attribute name, 0
    elsif symbols.kind_of? Array
      write_attribute name, SimpleFlaggableColumn.symbols_to_flags(
        symbols,
        symbols_flags,
        options[:throw_on_missing]
      )
    else # numeric, or anything else
      write_attribute name, symbols
    end
  end

  define_method name do
    SimpleFlaggableColumn.flags_to_symbols(read_attribute(name), symbols_flags)
  end
end