Sha256: 6734701f94d9e092a75b3b1587574738d20131c7d05543d7eb1d46e96315b3d3

Contents?: true

Size: 894 Bytes

Versions: 1

Compression:

Stored size: 894 Bytes

Contents

module ActiveRecord
  # Declare an enum attribute where the values map to strings enforced by PostgreSQL's
  # enumerated types.
  #
  #   class Conversation < ActiveRecord::Base
  #     include ActiveRecord::PGEnum(status: %i[active archived])
  #   end
  #
  # This is merely a wrapper over traditional enum syntax so that you can define
  # string-based enums with an array of values.
  def self.PGEnum(**definitions)
    values = definitions.values.map do |value|
      if value.is_a? Array
        keys   = value.map(&:to_sym)
        values = value.map(&:to_s)

        Hash[keys.zip(values)]
      else
        value
      end
    end

    Module.new do
      define_singleton_method(:inspect) { %{ActiveRecord::PGEnum(#{definitions.keys.join(" ")})} }

      define_singleton_method :included do |klass|
        klass.enum Hash[definitions.keys.zip(values)]
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
activerecord-pg_enum-0.4.0 lib/active_record/pg_enum/helper.rb