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
-
#parent ⇒ Object
Returns the value of attribute parent.
-
#serialize_enums_using_as_json ⇒ Object
writeonly
Sets the attribute serialize_enums_using_as_json.
-
#serialize_unknown_attributes ⇒ Object
writeonly
Sets the attribute serialize_unknown_attributes.
Class Method Summary collapse
-
.included(base) ⇒ Object
rubocop:disable Metrics/ModuleLength.
Instance Method Summary collapse
-
#==(other) ⇒ Boolean
(also: #eql?)
Compares two StoreModel::Model instances.
-
#[](attr_name) ⇒ Object
Accessing attribute using brackets.
-
#[]=(attr_name, value) ⇒ Object
Setting attribute using brackets.
-
#_has_attribute?(attr_name) ⇒ Boolean
Legacy implementation of #has_attribute?.
-
#as_json(options = {}) ⇒ Hash
Returns a hash representing the model.
-
#blank? ⇒ Boolean
Allows to call :presence validation on the association itself.
-
#fetch(attr_name) ⇒ Object
Returns an Object, similar to Hash#fetch, raises a KeyError if attr_name doesn’t exist.
-
#has_attribute?(attr_name) ⇒ Boolean
Checks if the attribute with a given name is defined.
-
#hash ⇒ Integer
Returns hash for a StoreModel::Model instance based on attributes hash.
-
#inspect ⇒ String
String representation of the object.
-
#serialize_enums_using_as_json? ⇒ Boolean
Returns the value of the ‘@serialize_enums_using_as_json` instance variable.
-
#serialize_unknown_attributes? ⇒ Boolean
Returns the value of the ‘@serialize_unknown_attributes` instance variable.
-
#type_for_attribute(attr_name) ⇒ ActiveModel::Type::Value
Returns the type of the attribute with the given name.
-
#unknown_attributes ⇒ Hash
Contains a hash of attributes which are not defined but exist in the underlying JSON data.
Instance Attribute Details
#parent ⇒ Object
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
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
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
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
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
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?
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.
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( = {}) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize serialize_unknown_attributes = if .key?(:serialize_unknown_attributes) [:serialize_unknown_attributes] else StoreModel.config.serialize_unknown_attributes end serialize_enums_using_as_json = if .key?(:serialize_enums_using_as_json) [: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) (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().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.
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.
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 = attr_name.is_a?(Symbol) ? "key not found: :#{attr_name}" : "key not found: #{attr_name}" raise KeyError, end end |
#has_attribute?(attr_name) ⇒ Boolean
Checks if the attribute with a given name is defined
rubocop:disable Naming/PredicateName
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 |
#hash ⇒ Integer
Returns hash for a StoreModel::Model instance based on attributes hash
122 123 124 |
# File 'lib/store_model/model.rb', line 122 def hash attributes.hash end |
#inspect ⇒ String
String representation of the object.
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.
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.
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
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_attributes ⇒ Hash
Contains a hash of attributes which are not defined but exist in the underlying JSON data
193 194 195 |
# File 'lib/store_model/model.rb', line 193 def unknown_attributes @unknown_attributes ||= {} end |