Class: ActiveRecordCompose::Model

Inherits:
Object
  • Object
show all
Extended by:
ActiveModel::Attributes::ClassMethods, ActiveModel::Callbacks, ActiveModel::Validations::Callbacks::ClassMethods, ActiveModel::Validations::ClassMethods
Includes:
ActiveModel::Attributes, ActiveModel::Model, ActiveModel::Validations::Callbacks, Attributes, Callbacks, Inspectable, Persistence, TransactionSupport, Validations
Defined in:
lib/active_record_compose/model.rb,
sig/active_record_compose.rbs,
sig/_internal/package_private.rbs

Overview

This is the core class of ActiveRecordCompose.

By defining subclasses of this model, you can use ActiveRecordCompose functionality in your application. It has the basic functionality of ActiveModel::Model and ActiveModel::Attributes, and also provides aggregation of multiple models and atomic updates through transaction control.

Examples:

Example of model registration.

class AccountRegistration < ActiveRecordCompose::Model
  def initialize( = Account.new, attributes = {})
    @account = 
    @profile = @account.build_profile
    models <<  << profile
    super(attributes)
  end

  attribute :register_confirmation, :boolean, default: false
  delegate_attribute :name, :email, to: :account
  delegate_attribute :firstname, :lastname, :age, to: :profile

  validates :register_confirmation, presence: true

  private

  attr_reader :account, :profile
end

Multiple model update once.

registration = AccountRegistration.new
registration.assign_attributes(
  name: "alice-in-wonderland",
  email: "alice@example.com",
  firstname: "Alice",
  lastname: "Smith",
  age: 24,
  register_confirmation: true
)

registration.save!      # Register Account and Profile models at the same time.
Account.count           # => (0 ->) 1
Profile.count           # => (0 ->) 1

Attribute delegation.

 = Account.new
.name = "foo"

registration = AccountRegistration.new()
registration.name         # => "foo" (delegated)
registration.name?        # => true  (delegated attribute method + `?`)

registration.name = "bar" # => updates account.name
.name              # => "bar"
.name?             # => true

registration.attributes   # => { "original_attribute" => "qux", "name" => "bar" }

Aggregate errors on invalid.

registration = AccountRegistration.new

registration.name = "alice-in-wonderland"
registration.firstname = "Alice"
registration.age = 18

registration.valid?
#=> false

# The error contents of the objects stored in models are aggregated.
# For example, direct access to errors in Account#email.
registration.errors[:email].to_a  # Account#email
#=> ["can't be blank"]

# Of course, the validation defined for itself is also working.
registration.errors[:register_confirmation].to_a
#=> ["can't be blank"]

registration.errors.to_a
#=> ["Email can't be blank", "Lastname can't be blank", "Register confirmation can't be blank"]

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Inspectable

inspection_filter

Methods included from Attributes

#_require_attributes_initialized, #_write_attribute, #attribute, #attribute_names, #attributes, delegated_attributes, #delegated_attributes, delegated_attributes=

Methods included from TransactionSupport

#_run_before_commit_callbacks, #_run_commit_callbacks, #_run_rollback_callbacks

Methods included from Validations

#errors, #valid?, #validate, #validate!

Constructor Details

#initialize(attributes = {}) ⇒ Model

Returns a new instance of Model.

Parameters:

  • (Hash[attribute_name, untyped])


92
93
94
# File 'lib/active_record_compose/model.rb', line 92

def initialize(attributes = {})
  super
end

Class Method Details

.after_commitvoid

This method returns an undefined value.

Parameters:

  • (callback[instance])
  • if: (condition[instance])
  • unless: (condition[instance])
  • (Object)


75
# File 'sig/active_record_compose.rbs', line 75

def self.after_commit: (*callback[instance], ?if: condition[instance], ?unless: condition[instance], **untyped) ?{ () [self: instance] -> void } -> void

.after_createvoid

This method returns an undefined value.

Parameters:

  • (callback[instance])
  • if: (condition[instance])
  • unless: (condition[instance])
  • (Object)


68
# File 'sig/active_record_compose.rbs', line 68

def self.after_create: (*callback[instance], ?if: condition[instance], ?unless: condition[instance], **untyped) ?{ () [self: instance] -> void } -> void

.after_rollbackvoid

This method returns an undefined value.

Parameters:

  • (callback[instance])
  • if: (condition[instance])
  • unless: (condition[instance])
  • (Object)


76
# File 'sig/active_record_compose.rbs', line 76

def self.after_rollback: (*callback[instance], ?if: condition[instance], ?unless: condition[instance], **untyped) ?{ () [self: instance] -> void } -> void

.after_savevoid

This method returns an undefined value.

Parameters:

  • (callback[instance])
  • if: (condition[instance])
  • unless: (condition[instance])
  • (Object)


64
# File 'sig/active_record_compose.rbs', line 64

def self.after_save: (*callback[instance], ?if: condition[instance], ?unless: condition[instance], **untyped) ?{ () [self: instance] -> void } -> void

.after_updatevoid

This method returns an undefined value.

Parameters:

  • (callback[instance])
  • if: (condition[instance])
  • unless: (condition[instance])
  • (Object)


72
# File 'sig/active_record_compose.rbs', line 72

def self.after_update: (*callback[instance], ?if: condition[instance], ?unless: condition[instance], **untyped) ?{ () [self: instance] -> void } -> void

.around_createvoid

This method returns an undefined value.

Parameters:

  • (around_callback[instance])
  • if: (condition[instance])
  • unless: (condition[instance])
  • (Object)


67
# File 'sig/active_record_compose.rbs', line 67

def self.around_create: (*around_callback[instance], ?if: condition[instance], ?unless: condition[instance], **untyped) ?{ () [self: instance] -> void } -> void

.around_savevoid

This method returns an undefined value.

Parameters:

  • (around_callback[instance])
  • if: (condition[instance])
  • unless: (condition[instance])
  • (Object)


63
# File 'sig/active_record_compose.rbs', line 63

def self.around_save: (*around_callback[instance], ?if: condition[instance], ?unless: condition[instance], **untyped) ?{ () [self: instance] -> void } -> void

.around_updatevoid

This method returns an undefined value.

Parameters:

  • (around_callback[instance])
  • if: (condition[instance])
  • unless: (condition[instance])
  • (Object)


71
# File 'sig/active_record_compose.rbs', line 71

def self.around_update: (*around_callback[instance], ?if: condition[instance], ?unless: condition[instance], **untyped) ?{ () [self: instance] -> void } -> void

.before_commitvoid

This method returns an undefined value.

Parameters:

  • (callback[instance])
  • if: (condition[instance])
  • unless: (condition[instance])
  • (Object)


74
# File 'sig/active_record_compose.rbs', line 74

def self.before_commit: (*callback[instance], ?if: condition[instance], ?unless: condition[instance], **untyped) ?{ () [self: instance] -> void } -> void

.before_createvoid

This method returns an undefined value.

Parameters:

  • (callback[instance])
  • if: (condition[instance])
  • unless: (condition[instance])
  • (Object)


66
# File 'sig/active_record_compose.rbs', line 66

def self.before_create: (*callback[instance], ?if: condition[instance], ?unless: condition[instance], **untyped) ?{ () [self: instance] -> void } -> void

.before_savevoid

This method returns an undefined value.

Parameters:

  • (callback[instance])
  • if: (condition[instance])
  • unless: (condition[instance])
  • (Object)


62
# File 'sig/active_record_compose.rbs', line 62

def self.before_save: (*callback[instance], ?if: condition[instance], ?unless: condition[instance], **untyped) ?{ () [self: instance] -> void } -> void

.before_updatevoid

This method returns an undefined value.

Parameters:

  • (callback[instance])
  • if: (condition[instance])
  • unless: (condition[instance])
  • (Object)


70
# File 'sig/active_record_compose.rbs', line 70

def self.before_update: (*callback[instance], ?if: condition[instance], ?unless: condition[instance], **untyped) ?{ () [self: instance] -> void } -> void

.delegate_attributeObject

Parameters:

  • methods (Object)
  • to: (Object)
  • allow_nil: (Boolean)

Returns:

  • (Object)


78
# File 'sig/active_record_compose.rbs', line 78

def self.delegate_attribute: (*untyped methods, to: untyped, ?allow_nil: bool) -> untyped

.filter_attributesArray[untyped]

Returns:

  • (Array[untyped])


80
# File 'sig/active_record_compose.rbs', line 80

def self.filter_attributes: () -> Array[untyped]

.filter_attributes=Object

Parameters:

  • (Array[untyped])

Returns:

  • (Object)


81
# File 'sig/active_record_compose.rbs', line 81

def self.filter_attributes=: (Array[untyped]) -> untyped

Instance Method Details

#idObject

Returns the ID value. This value is used when passing it to the :model option of form_with, etc. Normally it returns nil, but it can be overridden to delegate to the containing model.

Examples:

Redefine the id method by delegating to the containing model

class Foo < ActiveRecordCompose::Model
  def initialize(primary_model)
    @primary_model = primary_model
    # ...
  end

  def id
    primary_model.id
  end

  private

  attr_reader :primary_model
end

Returns:

  • (Object)

    ID value



117
# File 'lib/active_record_compose/model.rb', line 117

def id = nil

#inspectString

Returns:

  • (String)


91
# File 'sig/active_record_compose.rbs', line 91

def inspect: () -> String

#modelsActiveRecordCompose::ComposedCollection

Returns a collection of model elements to encapsulate.

Examples:

Adding models

models << inner_model_a << inner_model_b
models.push(inner_model_c)

#push can have :destroy :if options

models.push(profile, destroy: :blank_profile?)
models.push(profile, destroy: -> { blank_profile? })

Returns:



130
# File 'lib/active_record_compose/model.rb', line 130

def models = @__models ||= ActiveRecordCompose::ComposedCollection.new(self)

#override_validation_contextvalidation_context

Returns:

  • (validation_context)


112
# File 'sig/_internal/package_private.rbs', line 112

def override_validation_context: -> validation_context

#pretty_printvoid

This method returns an undefined value.

Parameters:

  • q (Object)


92
# File 'sig/active_record_compose.rbs', line 92

def pretty_print: (untyped q) -> void

#saveBoolean

Parameters:

  • options (Object)

Returns:

  • (Boolean)


84
# File 'sig/active_record_compose.rbs', line 84

def save: (**untyped options) -> bool

#save!Object

Parameters:

  • options (Object)

Returns:

  • (Object)


85
# File 'sig/active_record_compose.rbs', line 85

def save!: (**untyped options) -> untyped

#updateBoolean

Parameters:

  • (Hash[attribute_name, untyped])

Returns:

  • (Boolean)


86
# File 'sig/active_record_compose.rbs', line 86

def update: (Hash[attribute_name, untyped]) -> bool

#update!Object

Parameters:

  • (Hash[attribute_name, untyped])

Returns:

  • (Object)


87
# File 'sig/active_record_compose.rbs', line 87

def update!: (Hash[attribute_name, untyped]) -> untyped

#validate_modelsvoid

This method returns an undefined value.



111
# File 'sig/_internal/package_private.rbs', line 111

def validate_models: -> void