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_empty_attributes ⇒ Object
writeonly
Sets the attribute serialize_empty_attributes.
-
#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_empty_attributes? ⇒ Boolean
Returns the value of the ‘@serialize_empty_attributes` instance variable.
-
#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.
45 46 47 |
# File 'lib/store_model/model.rb', line 45 def parent @parent end |
#serialize_empty_attributes=(value) ⇒ Object (writeonly)
Sets the attribute serialize_empty_attributes
46 47 48 |
# File 'lib/store_model/model.rb', line 46 def serialize_empty_attributes=(value) @serialize_empty_attributes = value end |
#serialize_enums_using_as_json=(value) ⇒ Object (writeonly)
Sets the attribute serialize_enums_using_as_json
46 47 48 |
# File 'lib/store_model/model.rb', line 46 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
46 47 48 |
# File 'lib/store_model/model.rb', line 46 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
111 112 113 114 115 |
# File 'lib/store_model/model.rb', line 111 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
123 124 125 |
# File 'lib/store_model/model.rb', line 123 def [](attr_name) @attributes.fetch_value(attr_name.to_s) end |
#[]=(attr_name, value) ⇒ Object
Setting attribute using brackets
133 134 135 |
# File 'lib/store_model/model.rb', line 133 def []=(attr_name, value) @attributes.write_from_user(attr_name.to_s, value) end |
#_has_attribute?(attr_name) ⇒ Boolean
Legacy implementation of #has_attribute?
201 202 203 |
# File 'lib/store_model/model.rb', line 201 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.
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/store_model/model.rb', line 56 def as_json( = {}) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity 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 serialize_empty_attributes = if .key?(:serialize_empty_attributes) [:serialize_empty_attributes] else StoreModel.config.serialize_empty_attributes end # If the model is nested, we need to ensure that the serialization result = @attributes.keys.each_with_object({}) do |key, values| attr = @attributes.fetch(key) (attr, serialize_unknown_attributes, serialize_enums_using_as_json, serialize_empty_attributes) serialized = serialized_attribute(attr) values[key] = serialized if serialize_empty_attributes || !serialized.nil? 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.
147 148 149 |
# File 'lib/store_model/model.rb', line 147 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.
96 97 98 99 100 101 102 103 104 |
# File 'lib/store_model/model.rb', line 96 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
190 191 192 193 194 |
# File 'lib/store_model/model.rb', line 190 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
140 141 142 |
# File 'lib/store_model/model.rb', line 140 def hash attributes.hash end |
#inspect ⇒ String
String representation of the object.
154 155 156 157 158 |
# File 'lib/store_model/model.rb', line 154 def inspect attribute_string = attributes.map { |name, value| "#{name}: #{value.inspect}" } .join(", ") "#<#{self.class.name} #{attribute_string}>" end |
#serialize_empty_attributes? ⇒ Boolean
Returns the value of the ‘@serialize_empty_attributes` instance variable. The default value is the value of the globally configured serialize_empty_attributes option.
This method is used to determine whether empty values should be serialized when the as_json method is called in nested StoreModel::Model objects.
256 257 258 259 260 261 262 |
# File 'lib/store_model/model.rb', line 256 def serialize_empty_attributes? if @serialize_empty_attributes.nil? StoreModel.config.serialize_empty_attributes || true else @serialize_empty_attributes end 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.
239 240 241 242 243 244 245 |
# File 'lib/store_model/model.rb', line 239 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.
226 227 228 |
# File 'lib/store_model/model.rb', line 226 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
167 168 169 170 |
# File 'lib/store_model/model.rb', line 167 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
211 212 213 |
# File 'lib/store_model/model.rb', line 211 def unknown_attributes @unknown_attributes ||= {} end |