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