module Sequel::Plugins::Enum::ClassMethods

Public Instance Methods

enum(column, values, opts=OPTS) click to toggle source

Define instance and dataset methods in this class to treat column as a enum. See Enum documentation for usage.

Calls superclass method
# File lib/sequel/plugins/enum.rb, line 64
def enum(column, values, opts=OPTS)
  raise Sequel::Error, "enum column must be a symbol" unless column.is_a?(Symbol)
  raise Sequel::Error, "enum values must be provided as a hash with symbol keys" unless values.is_a?(Hash) && values.all?{|k,| k.is_a?(Symbol)}

  if prefix = opts[:prefix]
    prefix = column if prefix == true
    prefix = "#{prefix}_"
  end

  if suffix = opts[:suffix]
    suffix = column if suffix == true
    suffix = "_#{suffix}"
  end
  
  values = Hash[values].freeze
  inverted = values.invert.freeze

  unless @enum_methods
    @enum_methods = Module.new
    include @enum_methods
  end

  @enum_methods.module_eval do
    unless opts[:override_accessors] == false
      define_method(column) do
        v = super()
        inverted.fetch(v, v)
      end

      define_method(:"#{column}=") do |v|
        super(values.fetch(v, v))
      end
    end

    values.each do |key, value|
      define_method(:"#{prefix}#{key}#{suffix}!") do
        self[column] = value
        nil
      end

      define_method(:"#{prefix}#{key}#{suffix}?") do
        self[column] == value
      end
    end
  end

  unless opts[:dataset_methods] == false
    dataset_module do
      values.each do |key, value|
        cond = Sequel[column=>value]
        where :"#{prefix}#{key}#{suffix}", cond
        where :"#{prefix}not_#{key}#{suffix}", ~cond
      end
    end
  end
end