Class: ActiveModelSerializers::Model

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Model, ActiveModel::Serializers::JSON
Defined in:
lib/active_model_serializers/model.rb

Defined Under Namespace

Modules: DeriveAttributesFromNamesAndFixAccessors

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attributes = {}) ⇒ Model

Returns a new instance of Model.

Parameters:

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

87
88
89
90
91
92
# File 'lib/active_model_serializers/model.rb', line 87

def initialize(attributes = {})
  attributes ||= {} # protect against nil
  @attributes = attributes.symbolize_keys.with_indifferent_access
  @errors = ActiveModel::Errors.new(self)
  super
end

Instance Attribute Details

#attributesHash (readonly)

The only way to change the attributes of an instance is to directly mutate the attributes.

Examples:


model.attributes[:foo] = :bar

Returns:

  • (Hash)

84
85
86
# File 'lib/active_model_serializers/model.rb', line 84

def attributes
  @attributes
end

#errorsActiveModel::Errors (readonly)

Support for validation and other ActiveModel::Errors

Returns:

  • (ActiveModel::Errors)

74
75
76
# File 'lib/active_model_serializers/model.rb', line 74

def errors
  @errors
end

#updated_atString, ...

Note:

Though updated_at and updated_at= are defined, it will only show up in attributes when it is passed in to the initializer or added to attributes, such as attributes[:updated_at] = Time.current.

When not set, defaults to the time the file was modified.

Returns:

  • (String, Numeric, Time)

114
115
116
117
118
# File 'lib/active_model_serializers/model.rb', line 114

def updated_at
  attributes.fetch(:updated_at) do
    defined?(@updated_at) ? @updated_at : File.mtime(__FILE__)
  end
end

Class Method Details

.attributes(names) ⇒ Object

Note:

For now, the Model only supports the notion of 'attributes'. In the tests, there is a special Model that also supports 'associations'. This is important so that we can add accessors for values that should not appear in the attributes hash when modeling associations. It is not yet clear if it makes sense for a PORO to have associations outside of the tests.

Easily declare instance attributes with setters and getters for each.

To initialize an instance, all attributes must have setters. However, the hash returned by attributes instance method will ALWAYS be the value of the initial attributes, regardless of what accessors are defined. The only way to change the change the attributes after initialization is to mutate the attributes directly. Accessor methods do NOT mutate the attributes. (This is a bug).

Parameters:

  • names (Array<String, Symbol>)
  • name (String, Symbol)

39
40
41
42
43
44
45
# File 'lib/active_model_serializers/model.rb', line 39

def self.attributes(*names)
  self.attribute_names |= names.map(&:to_sym)
  # Silence redefinition of methods warnings
  ActiveModelSerializers.silence_warnings do
    attr_accessor(*names)
  end
end

.derive_attributes_from_names_and_fix_accessorsObject

Opt-in to breaking change


48
49
50
51
52
# File 'lib/active_model_serializers/model.rb', line 48

def self.derive_attributes_from_names_and_fix_accessors
  unless included_modules.include?(DeriveAttributesFromNamesAndFixAccessors)
    prepend(DeriveAttributesFromNamesAndFixAccessors)
  end
end

Instance Method Details

#attribute_namesArray<Symbol>

Declare names of attributes to be included in attributes hash. Is only available as a class-method since the ActiveModel::Serialization mixin in Rails uses an attribute_names local variable, which may conflict if we were to add instance methods here.

Returns:

  • (Array<Symbol>)

16
# File 'lib/active_model_serializers/model.rb', line 16

class_attribute :attribute_names, instance_writer: false, instance_reader: false

#cache_keyString

To customize model behavior, this method must be redefined. However, there are other ways of setting the cache_key a serializer uses.

Returns:

  • (String)

123
124
125
126
127
128
# File 'lib/active_model_serializers/model.rb', line 123

def cache_key
  ActiveSupport::Cache.expand_cache_key([
    self.class.model_name.name.downcase,
    "#{id}-#{updated_at.strftime('%Y%m%d%H%M%S%9N')}"
  ].compact)
end

#idString, ...

Note:

Though id is defined, it will only show up in attributes when it is passed in to the initializer or added to attributes, such as attributes[:id] = 5.

Defaults to the downcased model name. This probably isn't a good default, since it's not a unique instance identifier, but that's what is currently implemented _('-')_/.

Returns:

  • (String, Numeric, Symbol)

102
103
104
105
106
# File 'lib/active_model_serializers/model.rb', line 102

def id
  attributes.fetch(:id) do
    defined?(@id) ? @id : self.class.model_name.name && self.class.model_name.name.downcase
  end
end