mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #6629 from marcandre/destroy
Add ActiveRecord::Base#destroy!
This commit is contained in:
commit
e638c613d0
5 changed files with 34 additions and 0 deletions
|
@ -1,5 +1,10 @@
|
|||
## Rails 4.0.0 (unreleased) ##
|
||||
|
||||
* Added `#destroy!` which acts like `#destroy` but will raise an
|
||||
`ActiveRecord::RecordNotDestroyed` exception instead of returning `false`.
|
||||
|
||||
*Marc-André Lafortune*
|
||||
|
||||
* Allow blocks for `count` with `ActiveRecord::Relation`, to work similar as
|
||||
`Array#count`:
|
||||
|
||||
|
|
|
@ -53,6 +53,10 @@ module ActiveRecord
|
|||
class RecordNotSaved < ActiveRecordError
|
||||
end
|
||||
|
||||
# Raised by ActiveRecord::Base.destroy! when a call to destroy would return false.
|
||||
class RecordNotDestroyed < ActiveRecordError
|
||||
end
|
||||
|
||||
# Raised when SQL statement cannot be executed by the database (for example, it's often the case for
|
||||
# MySQL when Ruby driver used is too old).
|
||||
class StatementInvalid < ActiveRecordError
|
||||
|
|
|
@ -122,6 +122,11 @@ module ActiveRecord
|
|||
|
||||
# Deletes the record in the database and freezes this instance to reflect
|
||||
# that no changes should be made (since they can't be persisted).
|
||||
#
|
||||
# There's a series of callbacks associated with <tt>destroy</tt>. If
|
||||
# the <tt>before_destroy</tt> callback return +false+ the action is cancelled
|
||||
# and <tt>destroy</tt> returns +false+. See
|
||||
# ActiveRecord::Callbacks for further details.
|
||||
def destroy
|
||||
raise ReadOnlyRecord if readonly?
|
||||
destroy_associations
|
||||
|
@ -130,6 +135,17 @@ module ActiveRecord
|
|||
freeze
|
||||
end
|
||||
|
||||
# Deletes the record in the database and freezes this instance to reflect
|
||||
# that no changes should be made (since they can't be persisted).
|
||||
#
|
||||
# There's a series of callbacks associated with <tt>destroy!</tt>. If
|
||||
# the <tt>before_destroy</tt> callback return +false+ the action is cancelled
|
||||
# and <tt>destroy!</tt> raises ActiveRecord::RecordNotDestroyed. See
|
||||
# ActiveRecord::Callbacks for further details.
|
||||
def destroy!
|
||||
destroy || raise(ActiveRecord::RecordNotDestroyed)
|
||||
end
|
||||
|
||||
# Returns an instance of the specified +klass+ with the attributes of the
|
||||
# current record. This is mostly useful in relation to single-table
|
||||
# inheritance structures where you want a subclass to appear as the
|
||||
|
|
|
@ -426,11 +426,13 @@ class CallbacksTest < ActiveRecord::TestCase
|
|||
def test_before_destroy_returning_false
|
||||
david = ImmutableDeveloper.find(1)
|
||||
assert !david.destroy
|
||||
assert_raise(ActiveRecord::RecordNotDestroyed) { david.destroy! }
|
||||
assert_not_nil ImmutableDeveloper.find_by_id(1)
|
||||
|
||||
someone = CallbackCancellationDeveloper.find(1)
|
||||
someone.cancel_before_destroy = true
|
||||
assert !someone.destroy
|
||||
assert_raise(ActiveRecord::RecordNotDestroyed) { someone.destroy! }
|
||||
assert !someone.after_destroy_called
|
||||
end
|
||||
|
||||
|
|
|
@ -305,6 +305,13 @@ class PersistencesTest < ActiveRecord::TestCase
|
|||
assert_raise(ActiveRecord::RecordNotFound) { Topic.find(topic.id) }
|
||||
end
|
||||
|
||||
def test_destroy!
|
||||
topic = Topic.find(1)
|
||||
assert_equal topic, topic.destroy!, 'topic.destroy! did not return self'
|
||||
assert topic.frozen?, 'topic not frozen after destroy!'
|
||||
assert_raise(ActiveRecord::RecordNotFound) { Topic.find(topic.id) }
|
||||
end
|
||||
|
||||
def test_record_not_found_exception
|
||||
assert_raise(ActiveRecord::RecordNotFound) { Topic.find(99999) }
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue