Module: StoreModel::Model

Defined in:
lib/store_model/model.rb

Overview

When included into class configures it to handle JSON column

Defined Under Namespace

Modules: ClassMethods

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#parentObject

Returns the value of attribute parent.



37
38
39
# File 'lib/store_model/model.rb', line 37

def parent
  @parent
end

#serialize_enums_using_as_json=(value) ⇒ Object (writeonly)

Sets the attribute serialize_enums_using_as_json

Parameters:

  • value

    the value to set the attribute serialize_enums_using_as_json to.



38
39
40
# File 'lib/store_model/model.rb', line 38

def serialize_enums_using_as_json=(value)
  @serialize_enums_using_as_json = value
end

#serialize_unknown_attributes=(value) ⇒ Object (writeonly)

Sets the attribute serialize_unknown_attributes

Parameters:

  • value

    the value to set the attribute serialize_unknown_attributes to.



38
39
40
# File 'lib/store_model/model.rb', line 38

def serialize_unknown_attributes=(value)
  @serialize_unknown_attributes = value
end

Class Method Details

.included(base) ⇒ Object

rubocop:disable Metrics/ModuleLength



11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/store_model/model.rb', line 11

def self.included(base) # :nodoc:
  base.include ActiveModel::Model
  base.include ActiveModel::Attributes
  base.include ActiveRecord::AttributeMethods::BeforeTypeCast
  base.include ActiveModel::AttributeMethods
  base.include StoreModel::NestedAttributes

  base.extend StoreModel::Enum
  base.extend StoreModel::TypeBuilders

  base.attribute_method_suffix "?"

  base.extend(ClassMethods)
end

Instance Method Details

#==(other) ⇒ Boolean Also known as: eql?

Compares two StoreModel::Model instances

Parameters:

Returns:

  • (Boolean)


93
94
95
96
97
# File 'lib/store_model/model.rb', line 93

def ==(other)
  return super unless other.is_a?(self.class)

  attributes.all? { |name, value| value == other.attributes[name] }
end

#[](attr_name) ⇒ Object

Accessing attribute using brackets

Parameters:

  • attr_name (String, Symbol)

Returns:

  • (Object)


105
106
107
# File 'lib/store_model/model.rb', line 105

def [](attr_name)
  @attributes.fetch_value(attr_name.to_s)
end

#[]=(attr_name, value) ⇒ Object

Setting attribute using brackets

Parameters:

  • name (String, Symbol)
  • value (Object)

Returns:

  • (Object)


115
116
117
# File 'lib/store_model/model.rb', line 115

def []=(attr_name, value)
  @attributes.write_from_user(attr_name.to_s, value)
end

#_has_attribute?(attr_name) ⇒ Boolean

Legacy implementation of #has_attribute?

Parameters:

  • attr_name (String)

    name of the attribute

Returns:

  • (Boolean)


183
184
185
# File 'lib/store_model/model.rb', line 183

def _has_attribute?(attr_name)
  attribute_types.key?(attr_name)
end

#as_json(options = {}) ⇒ Hash

Returns a hash representing the model. Some configuration can be passed through options.

Parameters:

  • options (Hash) (defaults to: {})

Returns:

  • (Hash)


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/store_model/model.rb', line 48

def as_json(options = {}) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
  serialize_unknown_attributes = if options.key?(:serialize_unknown_attributes)
                                   options[:serialize_unknown_attributes]
                                 else
                                   StoreModel.config.serialize_unknown_attributes
                                 end

  serialize_enums_using_as_json = if options.key?(:serialize_enums_using_as_json)
                                    options[:serialize_enums_using_as_json]
                                  else
                                    StoreModel.config.serialize_enums_using_as_json
                                  end

  result = @attributes.keys.each_with_object({}) do |key, values|
    attr = @attributes.fetch(key)
    assign_serialization_options(attr, serialize_unknown_attributes, serialize_enums_using_as_json)
    values[key] = serialized_attribute(attr)
  end.with_indifferent_access

  result.merge!(unknown_attributes) if serialize_unknown_attributes
  result.as_json(options).tap do |json|
    serialize_enums!(json) if serialize_enums_using_as_json
  end
end

#blank?Boolean

Allows to call :presence validation on the association itself.

Returns:

  • (Boolean)


129
130
131
# File 'lib/store_model/model.rb', line 129

def blank?
  attributes.values.all?(&:blank?)
end

#fetch(attr_name) ⇒ Object

Returns an Object, similar to Hash#fetch, raises a KeyError if attr_name doesn’t exist.

Parameters:

  • attr_name (String, Symbol)

Returns:

  • Object



78
79
80
81
82
83
84
85
86
# File 'lib/store_model/model.rb', line 78

def fetch(attr_name)
  stringified_key = attr_name.to_s
  if attribute_names.include?(stringified_key) || attribute_aliases.key?(stringified_key)
    public_send(stringified_key)
  else
    message = attr_name.is_a?(Symbol) ? "key not found: :#{attr_name}" : "key not found: #{attr_name}"
    raise KeyError, message
  end
end

#has_attribute?(attr_name) ⇒ Boolean

Checks if the attribute with a given name is defined

rubocop:disable Naming/PredicateName

Examples:

class Person
  include StoreModel::Model
  attribute :name, :string
  alias_attribute :new_name, :name
end

Person.has_attribute?('name')     # => true
Person.has_attribute?('new_name') # => true
Person.has_attribute?(:age)       # => true
Person.has_attribute?(:nothing)   # => false

Parameters:

  • attr_name (String)

    name of the attribute

Returns:

  • (Boolean)


172
173
174
175
176
# File 'lib/store_model/model.rb', line 172

def has_attribute?(attr_name)
  attr_name = attr_name.to_s
  attr_name = self.class.attribute_aliases[attr_name] || attr_name
  attribute_types.key?(attr_name)
end

#hashInteger

Returns hash for a StoreModel::Model instance based on attributes hash

Returns:

  • (Integer)


122
123
124
# File 'lib/store_model/model.rb', line 122

def hash
  attributes.hash
end

#inspectString

String representation of the object.

Returns:

  • (String)


136
137
138
139
140
# File 'lib/store_model/model.rb', line 136

def inspect
  attribute_string = attributes.map { |name, value| "#{name}: #{value.inspect}" }
                               .join(", ")
  "#<#{self.class.name} #{attribute_string}>"
end

#serialize_enums_using_as_json?Boolean

Returns the value of the ‘@serialize_enums_using_as_json` instance variable. The default value is the value of the globally configured `serialize_enums_using_as_json` option.

This method is used to determine whether enums should be serialized when the ‘as_json` method is called in nested StoreModel::Model objects.

Returns:

  • (Boolean)


221
222
223
224
225
226
227
# File 'lib/store_model/model.rb', line 221

def serialize_enums_using_as_json?
  if @serialize_enums_using_as_json.nil?
    StoreModel.config.serialize_enums_using_as_json || false
  else
    @serialize_enums_using_as_json
  end
end

#serialize_unknown_attributes?Boolean

Returns the value of the ‘@serialize_unknown_attributes` instance variable. In the current specification, unknown attributes must be persisted in the database regardless of the globally configured `serialize_unknown_attributes` option. Therefore, it returns the default value `true` if the instance variable is `nil`.

This method is used to ensure that the ‘serialize_unknown_attributes` option is correctly applied to nested StoreModel::Model objects when the `as_json` method is called.

Returns:

  • (Boolean)


208
209
210
# File 'lib/store_model/model.rb', line 208

def serialize_unknown_attributes?
  @serialize_unknown_attributes.nil? ? true : @serialize_unknown_attributes
end

#type_for_attribute(attr_name) ⇒ ActiveModel::Type::Value

Returns the type of the attribute with the given name

Parameters:

  • attr_name (String)

    name of the attribute

Returns:

  • (ActiveModel::Type::Value)


149
150
151
152
# File 'lib/store_model/model.rb', line 149

def type_for_attribute(attr_name)
  attr_name = attr_name.to_s
  attribute_types[attr_name]
end

#unknown_attributesHash

Contains a hash of attributes which are not defined but exist in the underlying JSON data

Returns:

  • (Hash)


193
194
195
# File 'lib/store_model/model.rb', line 193

def unknown_attributes
  @unknown_attributes ||= {}
end