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 |