mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Introduce _delete_record
and use it for deleting a record
This commit is contained in:
parent
37984353f2
commit
ea45d56d3d
2 changed files with 23 additions and 21 deletions
|
@ -112,26 +112,22 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
def destroy_row
|
||||
affected_rows = super
|
||||
return super unless locking_enabled?
|
||||
|
||||
if locking_enabled? && affected_rows != 1
|
||||
locking_column = self.class.locking_column
|
||||
|
||||
affected_rows = self.class._delete_record(
|
||||
self.class.primary_key => id_in_database,
|
||||
locking_column => read_attribute_before_type_cast(locking_column)
|
||||
)
|
||||
|
||||
if affected_rows != 1
|
||||
raise ActiveRecord::StaleObjectError.new(self, "destroy")
|
||||
end
|
||||
|
||||
affected_rows
|
||||
end
|
||||
|
||||
def relation_for_destroy
|
||||
relation = super
|
||||
|
||||
if locking_enabled?
|
||||
locking_column = self.class.locking_column
|
||||
relation = relation.where(locking_column => read_attribute_before_type_cast(locking_column))
|
||||
end
|
||||
|
||||
relation
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
DEFAULT_LOCKING_COLUMN = "lock_version"
|
||||
|
||||
|
|
|
@ -197,6 +197,16 @@ module ActiveRecord
|
|||
connection.update(um, "#{self} Update")
|
||||
end
|
||||
|
||||
def _delete_record(constraints) # :nodoc:
|
||||
constraints = _substitute_values(constraints).map { |attr, bind| attr.eq(bind) }
|
||||
|
||||
dm = Arel::DeleteManager.new
|
||||
dm.from(arel_table)
|
||||
dm.wheres = constraints
|
||||
|
||||
connection.delete(dm, "#{self} Destroy")
|
||||
end
|
||||
|
||||
private
|
||||
# Called by +instantiate+ to decide which class to use for a new
|
||||
# record instance.
|
||||
|
@ -311,7 +321,7 @@ module ActiveRecord
|
|||
# callbacks or any <tt>:dependent</tt> association
|
||||
# options, use <tt>#destroy</tt>.
|
||||
def delete
|
||||
_relation_for_itself.delete_all if persisted?
|
||||
_delete_row if persisted?
|
||||
@destroyed = true
|
||||
freeze
|
||||
end
|
||||
|
@ -690,15 +700,11 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
def destroy_row
|
||||
relation_for_destroy.delete_all
|
||||
_delete_row
|
||||
end
|
||||
|
||||
def relation_for_destroy
|
||||
_relation_for_itself
|
||||
end
|
||||
|
||||
def _relation_for_itself
|
||||
self.class.unscoped.where(self.class.primary_key => id_in_database)
|
||||
def _delete_row
|
||||
self.class._delete_record(self.class.primary_key => id_in_database)
|
||||
end
|
||||
|
||||
def create_or_update(*args, &block)
|
||||
|
|
Loading…
Reference in a new issue