module EnumTable::Record::ClassMethods

Public Instance Methods

enum(name, options={}) click to toggle source
# File lib/enum_table/record.rb, line 11
      def enum(name, options={})
        name = name.to_sym
        reflection = enums[name] ? enums[name].dup : Reflection.new(name)
        [:type, :id_name].each do |key|
          value = options[key] and
            reflection.send "#{key}=", value
        end
        reflection.to_populate do |ref|
          enum_map(name, options).each do |value, id|
            ref.add_value id, value
          end
        end
        self.enums = enums.merge(name => reflection, name.to_s => reflection)

        class_eval <<-EOS, __FILE__, __LINE__ + 1
          def #{name}
            read_enum(:#{name})
          end

          def #{name}=(value)
            write_enum(:#{name}, value)
          end

          def #{name}?
            query_enum(:#{name})
          end

          def #{name}_changed?
            enum_changed?(:#{name})
          end

          def #{name}_was
            enum_was(:#{name})
          end

          def #{name}_change
            enum_change(:#{name})
          end
        EOS

        reflection
      end
enum_id(name, value) click to toggle source
# File lib/enum_table/record.rb, line 77
def enum_id(name, value)
  reflection = enums[name] or
    raise ArgumentError, "no such enum: #{name}"
  reflection.id(value)
end
enum_map(name, options) click to toggle source
# File lib/enum_table/record.rb, line 54
def enum_map(name, options)
  case (table = options[:table])
  when Hash
    table
  when Array
    map = {}
    table.each_with_index { |element, i| map[element] = i + 1 }
    map
  else
    map = {}
    table_name = table || "#{self.table_name.singularize}_#{name.to_s.pluralize}"
    return {} if EnumTable.missing_tables_allowed? && !connection.tables.include?(table_name)
    connection.execute("SELECT id, value FROM #{connection.quote_table_name table_name}").each do |row|
      map[row[1]] = row[0]
    end
    map
  end
end
enum_value(name, id) click to toggle source
# File lib/enum_table/record.rb, line 83
def enum_value(name, id)
  reflection = enums[name] or
    raise ArgumentError, "no such enum: #{name}"
  reflection.value(id)
end
reflect_on_enum(name) click to toggle source
# File lib/enum_table/record.rb, line 73
def reflect_on_enum(name)
  enums[name]
end