Module: Conflow::Redis::Model::ClassMethods

Defined in:
lib/conflow/redis/model.rb

Overview

Methods for defining fields on model

Constant Summary collapse

ALLOWED_TYPES =

Maps types (option for #field) to specific type field

{
  hash:       Conflow::Redis::HashField,
  array:      Conflow::Redis::ArrayField,
  value:      Conflow::Redis::ValueField,
  sorted_set: Conflow::Redis::SortedSetField,
  set:        Conflow::Redis::SetField
}.freeze

Instance Method Summary collapse

Instance Method Details

#field(name, type) ⇒ Object

Defines Redis field accessors.

Examples:

model_class.field :data, :hash
instance = model_class.new
instance.hash["something"] = 800
instance.hash = { something: "else"}
instance.hash["something"] #=> "else"

Parameters:

  • name (Symbol)

    name of the field

  • type (:hash, :array, :value, :sorted_set, :set)

    type of the new field

Raises:

  • (ArgumentError)

See Also:



68
69
70
71
72
73
74
# File 'lib/conflow/redis/model.rb', line 68

def field(name, type)
  type_class = ALLOWED_TYPES[type]
  raise ArgumentError, "Unknown type: #{type}. Should be one of: #{ALLOWED_TYPES.keys.inspect}" unless type_class

  fields << name
  FieldBuilder.new(name, type_class).call(self)
end

#fieldsArray<Symbol>

Returns fields defined on this class.

Returns:

  • (Array<Symbol>)

    fields defined on this class



86
87
88
# File 'lib/conflow/redis/model.rb', line 86

def fields
  @fields ||= []
end

#has_many(name, klass, field_name: "#{name.to_s.chop}_ids") ⇒ Object

Convienience method for defining relation-like accessor.

Examples:

has_many :jobs, Conflow::Job # defines #job_ids and #jobs


79
80
81
82
83
# File 'lib/conflow/redis/model.rb', line 79

def has_many(name, klass, field_name: "#{name.to_s.chop}_ids")
  field(field_name, :array)
  relations << name
  define_method(name) { send(field_name).map { |id| klass.new(id) } }
end

#inherited(subclass) ⇒ Object

Copies field and relations information



48
49
50
51
# File 'lib/conflow/redis/model.rb', line 48

def inherited(subclass)
  subclass.instance_variable_set("@fields", fields.dup)
  subclass.instance_variable_set("@relations", relations.dup)
end

#relationsArray<Symbol>

Returns relations defined on this class.

Returns:

  • (Array<Symbol>)

    relations defined on this class



91
92
93
# File 'lib/conflow/redis/model.rb', line 91

def relations
  @relations ||= []
end