module Neo4j::Shared::Enum::ClassMethods
Constants
- DEFAULT_OPTIONS_FOR_ENUMS
- VALID_OPTIONS_FOR_ENUMS
Attributes
neo4j_enum_data[R]
Public Instance Methods
enum(parameters = {})
click to toggle source
Similar to ActiveRecord enum, maps an integer value on the database to a set of enum keys.
@example Base example
class Media include Neo4j::ActiveNode enum type: [:image, :video, :unknown] end Media.types # => { :images => 0, :video => 1, :unknown => 2 } media.video! media.image? # => false media.type # => :video Media.videos # => All medias with type = 1 (:video) Media.where(type: :video) # => All medias with type = 1 (:video)
@example Prefix-ing an enum
Media.enum type: [:image, :video, :unknown], _prefix: :enum media.enum_video! media.enum_video? # => true
@example Suffix-ing an enum
Media.enum type: [:image, :video, :unknown], _suffix: true media.video_type! media.video_type? # => true
@example Disable index: :exact for enum elements
Media.enum type: [:image, :video, :unknown], _index: false
@example Define a custom mapping for keys-numbers
Media.enum type: { image: 1, video: 2, unknown: 3 }
@see edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html
# File lib/neo4j/shared/enum.rb 46 def enum(parameters = {}) 47 options, parameters = *split_options_and_parameters(parameters) 48 parameters.each do |property_name, enum_keys| 49 enum_keys = normalize_key_list enum_keys 50 @neo4j_enum_data ||= {} 51 @neo4j_enum_data[property_name] = enum_keys 52 define_property(property_name, enum_keys, options) 53 define_enum_methods(property_name, enum_keys, options) 54 end 55 end
Protected Instance Methods
build_method_name(base_name, property_name, options)
click to toggle source
# File lib/neo4j/shared/enum.rb 133 def build_method_name(base_name, property_name, options) 134 method_name = base_name 135 method_name = "#{method_name}_#{property_name}" if options[:_suffix] 136 method_name = "#{options[:_prefix]}_#{method_name}" if options[:_prefix] 137 method_name 138 end
build_property_options(_enum_keys, options = {})
click to toggle source
# File lib/neo4j/shared/enum.rb 94 def build_property_options(_enum_keys, options = {}) 95 { 96 default: options[:_default] 97 } 98 end
check_enum_method_conflicts!(property_name, method_name)
click to toggle source
# File lib/neo4j/shared/enum.rb 140 def check_enum_method_conflicts!(property_name, method_name) 141 fail ConflictingEnumMethodError, 142 "The enum `#{property_name}` is trying to define a `#{method_name}` method, "\ 143 'that is already defined. Try to use options `:prefix` or `:suffix` '\ 144 'to avoid conflicts.' if instance_methods(false).include?(method_name) 145 end
define_class_methods(property_name, enum_keys)
click to toggle source
# File lib/neo4j/shared/enum.rb 106 def define_class_methods(property_name, enum_keys) 107 plural_property_name = property_name.to_s.pluralize.to_sym 108 define_singleton_method(plural_property_name) do 109 enum_keys 110 end 111 end
define_enum_methods(property_name, enum_keys, options)
click to toggle source
# File lib/neo4j/shared/enum.rb 100 def define_enum_methods(property_name, enum_keys, options) 101 define_enum_methods_?(property_name, enum_keys, options) 102 define_enum_methods_!(property_name, enum_keys, options) 103 define_class_methods(property_name, enum_keys) 104 end
define_enum_methods_!(property_name, enum_keys, options)
click to toggle source
# File lib/neo4j/shared/enum.rb 123 def define_enum_methods_!(property_name, enum_keys, options) 124 enum_keys.keys.each do |enum_value| 125 method_name = build_method_name(enum_value, property_name, options) 126 check_enum_method_conflicts! property_name, :"#{method_name}!" 127 define_method("#{method_name}!") do 128 __send__("#{property_name}=", enum_value) 129 end 130 end 131 end
define_enum_methods_?(property_name, enum_keys, options)
click to toggle source
# File lib/neo4j/shared/enum.rb 113 def define_enum_methods_?(property_name, enum_keys, options) 114 enum_keys.keys.each do |enum_value| 115 method_name = build_method_name(enum_value, property_name, options) 116 check_enum_method_conflicts! property_name, :"#{method_name}?" 117 define_method("#{method_name}?") do 118 __send__(property_name).to_s.to_sym == enum_value 119 end 120 end 121 end
define_property(property_name, enum_keys, options)
click to toggle source
# File lib/neo4j/shared/enum.rb 88 def define_property(property_name, enum_keys, options) 89 property_options = build_property_options(enum_keys, options) 90 property property_name, property_options 91 serialize property_name, Neo4j::Shared::TypeConverters::EnumConverter.new(enum_keys, property_options) 92 end
normalize_key_list(enum_keys)
click to toggle source
# File lib/neo4j/shared/enum.rb 59 def normalize_key_list(enum_keys) 60 case enum_keys 61 when Hash 62 enum_keys 63 when Array 64 Hash[enum_keys.each_with_index.to_a] 65 else 66 fail ArgumentError, 'Invalid parameter for enum. Please provide an Array or an Hash.' 67 end 68 end
split_options_and_parameters(parameters)
click to toggle source
# File lib/neo4j/shared/enum.rb 75 def split_options_and_parameters(parameters) 76 options = DEFAULT_OPTIONS_FOR_ENUMS.clone 77 new_parameters = {} 78 parameters.each do |k, v| 79 if VALID_OPTIONS_FOR_ENUMS.include? k 80 options[k] = v 81 else 82 new_parameters[k] = v 83 end 84 end 85 [options, new_parameters] 86 end