Movatterモバイル変換


[0]ホーム

URL:


Skip to ContentSkip to Search
Ruby on Rails 8.1.1

Module ActiveModel::Dirty

v8.1.1

Active Model Dirty

Provides a way to track changes in your object in the same way as Active Record does.

The requirements for implementingActiveModel::Dirty are:

  • include ActiveModel::Dirty in your object.

  • Calldefine_attribute_methods passing each method you want to track.

  • Call*_will_change! before each change to the tracked attribute.

  • Callchanges_applied after the changes are persisted.

  • Callclear_changes_information when you want to reset the changes information.

  • Callrestore_attributes when you want to restore previous data.

A minimal implementation could be:

classPersonincludeActiveModel::Dirtydefine_attribute_methods:namedefinitialize@name =nilenddefname@nameenddefname=(val)name_will_change!unlessval==@name@name =valenddefsave# do persistence workchanges_appliedenddefreload!# get the values from the persistence layerclear_changes_informationenddefrollback!restore_attributesendend

A newly instantiatedPerson object is unchanged:

person =Person.newperson.changed?# => false

Change the name:

person.name ='Bob'person.changed?# => trueperson.name_changed?# => trueperson.name_changed?(from:nil,to:"Bob")# => trueperson.name_was# => nilperson.name_change# => [nil, "Bob"]person.name ='Bill'person.name_change# => [nil, "Bill"]

Save the changes:

person.saveperson.changed?# => falseperson.name_changed?# => false

Reset the changes:

person.previous_changes# => {"name" => [nil, "Bill"]}person.name_previously_changed?# => trueperson.name_previously_changed?(from:nil,to:"Bill")# => trueperson.name_previous_change# => [nil, "Bill"]person.name_previously_was# => nilperson.reload!person.previous_changes# => {}

Rollback the changes:

person.name ="Uncle Bob"person.rollback!person.name# => "Bill"person.name_changed?# => false

Assigning the same value leaves the attribute unchanged:

person.name ='Bill'person.name_changed?# => falseperson.name_change# => nil

Which attributes have changed?

person.name ='Bob'person.changed# => ["name"]person.changes# => {"name" => ["Bill", "Bob"]}

If an attribute is modified in-place then make use of*_will_change! to mark that the attribute is changing. Otherwise Active Model can’t track changes to in-place attributes. Note that Active Record can detect in-place modifications automatically. You do not need to call*_will_change! on Active Record models.

person.name_will_change!person.name_change# => ["Bill", "Bill"]person.name<<'y'person.name_change# => ["Bill", "Billy"]

Methods can be invoked asname_changed? or by passing an argument to the generic methodattribute_changed?("name").

Methods
#
A
C
P
R
Included Modules

Instance Public methods

*_changeLink

This method is generated for each attribute.

Returns the old and the new value of the attribute.

person =Person.newperson.name ='Nick'person.name_change# => [nil, 'Nick']

Source:on GitHub

# File activemodel/lib/active_model/dirty.rb, line 155

*_changed?Link

This method is generated for each attribute.

Returns true if the attribute has unsaved changes.

person =Person.newperson.name ='Andrew'person.name_changed?# => true

Source:on GitHub

# File activemodel/lib/active_model/dirty.rb, line 144

*_previous_changeLink

This method is generated for each attribute.

Returns the old and the new value of the attribute before the last save.

person =Person.newperson.name ='Emmanuel'person.saveperson.name_previous_change# => [nil, 'Emmanuel']

Source:on GitHub

# File activemodel/lib/active_model/dirty.rb, line 193

*_previously_changed?(**options)Link

This method is generated for each attribute.

Returns true if the attribute previously had unsaved changes.

person =Person.newperson.name ='Britanny'person.saveperson.name_previously_changed?# => trueperson.name_previously_changed?(from:nil,to:'Britanny')# => true

Source:on GitHub

# File activemodel/lib/active_model/dirty.rb, line 129

*_previously_wasLink

This method is generated for each attribute.

Returns the old value of the attribute before the last save.

person =Person.newperson.name ='Sage'person.saveperson.name_previously_was# => nil

Source:on GitHub

# File activemodel/lib/active_model/dirty.rb, line 205

*_wasLink

This method is generated for each attribute.

Returns the old value of the attribute.

person =Person.new(name:'Steph')person.name ='Stephanie'person.name_was# => 'Steph'

Source:on GitHub

# File activemodel/lib/active_model/dirty.rb, line 182

*_will_change!Link

This method is generated for each attribute.

If an attribute is modified in-place then make use of*_will_change! to mark that the attribute is changing. Otherwise ActiveModel can’t track changes to in-place attributes. Note that Active Record can detect in-place modifications automatically. You do not need to call*_will_change! on Active Record models.

person =Person.new('Sandy')person.name_will_change!person.name_change# => ['Sandy', 'Sandy']

Source:on GitHub

# File activemodel/lib/active_model/dirty.rb, line 166

attribute_changed?(attr_name, **options)Link

Dispatch target for*_changed? attribute methods.

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 300defattribute_changed?(attr_name,**options)mutations_from_database.changed?(attr_name.to_s,**options)end

attribute_previously_changed?(attr_name, **options)Link

Dispatch target for*_previously_changed? attribute methods.

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 310defattribute_previously_changed?(attr_name,**options)mutations_before_last_save.changed?(attr_name.to_s,**options)end

attribute_previously_was(attr_name)Link

Dispatch target for*_previously_was attribute methods.

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 315defattribute_previously_was(attr_name)mutations_before_last_save.original_value(attr_name.to_s)end

attribute_was(attr_name)Link

Dispatch target for*_was attribute methods.

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 305defattribute_was(attr_name)mutations_from_database.original_value(attr_name.to_s)end

changed()Link

Returns an array with the name of the attributes with unsaved changes.

person.changed# => []person.name ='bob'person.changed# => ["name"]

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 295defchangedmutations_from_database.changed_attribute_namesend

changed?()Link

Returnstrue if any of the attributes has unsaved changes,false otherwise.

person.changed?# => falseperson.name ='bob'person.changed?# => true

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 286defchanged?mutations_from_database.any_changes?end

changed_attributes()Link

Returns a hash of the attributes with unsaved changes indicating their original values likeattr => original value.

person.name# => "bob"person.name ='robert'person.changed_attributes# => {"name" => "bob"}

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 343defchanged_attributesmutations_from_database.changed_valuesend

changes()Link

Returns a hash of changed attributes indicating their original and new values likeattr => [original value, new value].

person.changes# => {}person.name ='bob'person.changes# => { "name" => ["bill", "bob"] }

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 353defchangesmutations_from_database.changesend

changes_applied()Link

Clears dirty data and moveschanges toprevious_changes andmutations_from_database tomutations_before_last_save respectively.

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 272defchanges_appliedunlessdefined?(@attributes)mutations_from_database.finalize_changesend@mutations_before_last_save =mutations_from_databaseforget_attribute_assignments@mutations_from_database =nilend

clear_*_changeLink

This method is generated for each attribute.

Clears all dirty data of the attribute: current changes and previous changes.

person =Person.new(name:'Chris')person.name ='Jason'person.name_change# => ['Chris', 'Jason']person.clear_name_changeperson.name_change# => nil

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 241attribute_method_suffix"_previously_changed?","_changed?",parameters:"**options"

clear_attribute_changes(attr_names)Link

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 331defclear_attribute_changes(attr_names)attr_names.eachdo|attr_name|clear_attribute_change(attr_name)endend

clear_changes_information()Link

Clears all dirty data: current changes and previous changes.

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 325defclear_changes_information@mutations_before_last_save =nilforget_attribute_assignments@mutations_from_database =nilend

previous_changes()Link

Returns a hash of attributes that were changed before the model was saved.

person.name# => "bob"person.name ='robert'person.saveperson.previous_changes# => {"name" => ["bob", "robert"]}

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 363defprevious_changesmutations_before_last_save.changesend

restore_*!Link

This method is generated for each attribute.

Restores the attribute to the old value.

person =Person.newperson.name ='Amanda'person.restore_name!person.name# => nil

Source:on GitHub

# File activemodel/lib/active_model/dirty.rb, line 217

restore_attributes(attr_names = changed)Link

Restore all previous data of the provided attributes.

Source:show |on GitHub

# File activemodel/lib/active_model/dirty.rb, line 320defrestore_attributes(attr_names =changed)attr_names.each {|attr_name|restore_attribute!(attr_name) }end

[8]ページ先頭

©2009-2025 Movatter.jp