Sha256: 8ab7059788941f6be8981d4c4681137da880782408932384b711830e153d41f1

Contents?: true

Size: 1.64 KB

Versions: 19

Compression:

Stored size: 1.64 KB

Contents

module CouchbaseOrm
    module Enum
        private

        def enum(options)
            # options contains an optional default value, and the name of the
            # enum, e.g enum visibility: %i(group org public), default: :group
            default = options.delete(:default)
            name = options.keys.first.to_sym
            values = options[name]

            # values is assumed to be a list of symbols. each value is assigned an
            # integer, and this number is used for db storage. numbers start at 1.
            mapping = {}
            values.each_with_index do |value, i|
                mapping[value.to_sym] = i + 1
                mapping[i + 1] = value.to_sym
            end

            # VISIBILITY = {group: 0, 0: group ...}
            const_set(name.to_s.upcase, mapping)

            # lookup the default's integer value
            if default
                default_value = mapping[default]
                raise 'Unknown default value' unless default_value
            else
                default_value = 1
            end
            attribute name, default: default_value

            # keep the attribute's value within bounds
            before_save do |record|
                value = record[name]

                unless value.nil?
                    value = case value
                    when Symbol, String
                        record.class.const_get(name.to_s.upcase)[value.to_sym]
                    else
                        Integer(value)
                    end
                end

                record[name] = (1..values.length).cover?(value) ? value : default_value
            end
        end
    end
end

Version data entries

19 entries across 19 versions & 1 rubygems

Version Path
couchbase-orm-1.1.1 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-1.1.0 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-1.0.0 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.2.1 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.2.0 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.1.2 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.1.1 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.1.0 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.0.12 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.0.11 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.0.10 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.0.9 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.0.8 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.0.6 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.0.5 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.0.4 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.0.3 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.0.2 lib/couchbase-orm/utilities/enum.rb
couchbase-orm-0.0.1 lib/couchbase-orm/utilities/enum.rb