instance method
touch
Ruby on Rails 5.0.7.2
Since v3.0.20Signature
touch(*names, time: nil)
Saves the record with the updated_at/on attributes set to the current time or the time specified. Please note that no validation is performed and only the after_touch, after_commit and after_rollback callbacks are executed.
This method can be passed attribute names and an optional time argument. If attribute names are passed, they are updated along with updated_at/on attributes. If no time argument is passed, the current time is used as default.
product.touch # updates updated_at/on with current time
product.touch(time: Time.new(2015, 2, 16, 0, 0, 0)) # updates updated_at/on with specified time
product.touch(:designed_at) # updates the designed_at attribute and updated_at/on
product.touch(:started_at, :ended_at) # updates started_at, ended_at and updated_at/on attributes
If used along with belongs_to then touch will invoke touch method on associated object.
class Brake < ActiveRecord::Base
belongs_to :car, touch: true
end
class Car < ActiveRecord::Base
belongs_to :corporation, touch: true
end
# triggers @brake.car.touch and @brake.car.corporation.touch
@brake.touch
Note that touch must be used on a persisted object, or else an ActiveRecordError will be thrown. For example:
ball = Ball.new
ball.touch(:updated_at) # => raises ActiveRecordError
Parameters
-
namesrest -
timekey = nil
Source
# File activerecord/lib/active_record/persistence.rb, line 490
def touch(*names, time: nil)
unless persisted?
raise ActiveRecordError, <<-MSG.squish
cannot touch on a new or destroyed record object. Consider using
persisted?, new_record?, or destroyed? before touching
MSG
end
time ||= current_time_from_proper_timezone
attributes = timestamp_attributes_for_update_in_model
attributes.concat(names)
unless attributes.empty?
changes = {}
attributes.each do |column|
column = column.to_s
changes[column] = write_attribute(column, time)
end
clear_attribute_changes(changes.keys)
primary_key = self.class.primary_key
scope = self.class.unscoped.where(primary_key => _read_attribute(primary_key))
if locking_enabled?
locking_column = self.class.locking_column
scope = scope.where(locking_column => _read_attribute(locking_column))
changes[locking_column] = increment_lock
end
result = scope.update_all(changes) == 1
if !result && locking_enabled?
raise ActiveRecord::StaleObjectError.new(self, "touch")
end
result
else
true
end
end
Defined in activerecord/lib/active_record/persistence.rb line 490
· View on GitHub
· Improve this page
· Find usages on GitHub
Defined in ActiveRecord::Persistence