Module: StoreModel::Model

Defined in:
lib/store_model/model.rb

Overview

When included into class configures it to handle JSON column

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#parentObject

Returns the value of attribute parent.



24
25
26
# File 'lib/store_model/model.rb', line 24

def parent
  @parent
end

Class Method Details

.included(base) ⇒ Object

rubocop:disable Metrics/ModuleLength



11
12
13
14
15
16
17
18
19
20
21
22
# 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 "?"
end

Instance Method Details

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

Compares two StoreModel::Model instances



77
78
79
80
81
# File 'lib/store_model/model.rb', line 77

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



89
90
91
# File 'lib/store_model/model.rb', line 89

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

#[]=(attr_name, value) ⇒ Object

Setting attribute using brackets



99
100
101
# File 'lib/store_model/model.rb', line 99

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

#_has_attribute?(attr_name) ⇒ Boolean

Legacy implementation of #has_attribute?



167
168
169
# File 'lib/store_model/model.rb', line 167

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.



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/store_model/model.rb', line 34

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|
    values[key] = serialized_attribute(key)
  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.



113
114
115
# File 'lib/store_model/model.rb', line 113

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.



62
63
64
65
66
67
68
69
70
# File 'lib/store_model/model.rb', line 62

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


156
157
158
159
160
# File 'lib/store_model/model.rb', line 156

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



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

def hash
  attributes.hash
end

#inspectString

String representation of the object.



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

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

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

Returns the type of the attribute with the given name



133
134
135
136
# File 'lib/store_model/model.rb', line 133

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



177
178
179
# File 'lib/store_model/model.rb', line 177

def unknown_attributes
  @unknown_attributes ||= {}
end