mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Add Model#delete instance method, similar to Model.delete class method. [#1086 state:resolved]
Signed-off-by: Pratik Naik <pratiknaik@gmail.com>
This commit is contained in:
committed by
Pratik Naik
parent
5f83e1844c
commit
46939a9b5a
@@ -1,5 +1,7 @@
|
||||
*Edge*
|
||||
|
||||
* Add Model#delete instance method, similar to Model.delete class method. #1086 [Hongli Lai]
|
||||
|
||||
* MySQL: cope with quirky default values for not-null text columns. #1043 [Frederick Cheung]
|
||||
|
||||
* Multiparameter attributes skip time zone conversion for time-only columns [#1030 state:resolved] [Geoff Buesing]
|
||||
|
||||
@@ -1470,7 +1470,7 @@ module ActiveRecord
|
||||
method_name = "has_one_dependent_delete_for_#{reflection.name}".to_sym
|
||||
define_method(method_name) do
|
||||
association = send(reflection.name)
|
||||
association.class.delete(association.id) unless association.nil?
|
||||
association.delete unless association.nil?
|
||||
end
|
||||
before_destroy method_name
|
||||
when :nullify
|
||||
@@ -1500,7 +1500,7 @@ module ActiveRecord
|
||||
method_name = "belongs_to_dependent_delete_for_#{reflection.name}".to_sym
|
||||
define_method(method_name) do
|
||||
association = send(reflection.name)
|
||||
association.class.delete(association.id) unless association.nil?
|
||||
association.delete unless association.nil?
|
||||
end
|
||||
before_destroy method_name
|
||||
else
|
||||
|
||||
@@ -2304,6 +2304,16 @@ module ActiveRecord #:nodoc:
|
||||
create_or_update || raise(RecordNotSaved)
|
||||
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).
|
||||
#
|
||||
# Unlike #destroy, this method doesn't run any +before_delete+ and +after_delete+
|
||||
# callbacks, nor will it enforce any association +:dependent+ rules.
|
||||
def delete
|
||||
self.class.delete(id) unless new_record?
|
||||
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).
|
||||
def destroy
|
||||
|
||||
@@ -472,6 +472,18 @@ class BasicsTest < ActiveRecord::TestCase
|
||||
assert topic.instance_variable_get("@custom_approved")
|
||||
end
|
||||
|
||||
def test_delete
|
||||
topic = Topic.find(1)
|
||||
assert_equal topic, topic.delete, 'topic.delete did not return self'
|
||||
assert topic.frozen?, 'topic not frozen after delete'
|
||||
assert_raise(ActiveRecord::RecordNotFound) { Topic.find(topic.id) }
|
||||
end
|
||||
|
||||
def test_delete_doesnt_run_callbacks
|
||||
Topic.find(1).delete
|
||||
assert_not_nil Topic.find(2)
|
||||
end
|
||||
|
||||
def test_destroy
|
||||
topic = Topic.find(1)
|
||||
assert_equal topic, topic.destroy, 'topic.destroy did not return self'
|
||||
@@ -820,6 +832,20 @@ class BasicsTest < ActiveRecord::TestCase
|
||||
assert_equal [ Topic.find(1) ], [ Topic.find(2).topic ] & [ Topic.find(1) ]
|
||||
end
|
||||
|
||||
def test_delete_new_record
|
||||
client = Client.new
|
||||
client.delete
|
||||
assert client.frozen?
|
||||
end
|
||||
|
||||
def test_delete_record_with_associations
|
||||
client = Client.find(3)
|
||||
client.delete
|
||||
assert client.frozen?
|
||||
assert_kind_of Firm, client.firm
|
||||
assert_raises(ActiveSupport::FrozenObjectError) { client.name = "something else" }
|
||||
end
|
||||
|
||||
def test_destroy_new_record
|
||||
client = Client.new
|
||||
client.destroy
|
||||
|
||||
Reference in New Issue
Block a user