Skip to content

Commit ccc91d3

Browse files
committed
Return early for new_record and deleted objects on update_columns
1 parent cb6cfd2 commit ccc91d3

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

spec/marten/db/model/persistence_spec.cr

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1579,6 +1579,17 @@ describe Marten::DB::Model::Persistence do
15791579
object.username.should eq "test1"
15801580
object.email.should eq "test1@example.com"
15811581
end
1582+
1583+
it "does not allow to update for a new record" do
1584+
object = TestUser.new(first_name: "John", last_name: "Doe")
1585+
object.update_columns({"username" => "test1", "email" => "test1@example.com"}).should be_false
1586+
end
1587+
1588+
it "does not allow to update for a destroyed record" do
1589+
object = TestUser.create!(username: "jd", email: "jd@example.com", first_name: "John", last_name: "Doe")
1590+
object.delete
1591+
object.update_columns({"username" => "test1", "email" => "test1@example.com"}).should be_false
1592+
end
15821593
end
15831594

15841595
describe "#update_columns!" do
@@ -1627,7 +1638,7 @@ describe Marten::DB::Model::Persistence do
16271638
object.email.should eq "test1@example.com"
16281639
end
16291640

1630-
it "raises an error when trying to update a new record" do
1641+
it "does not allow to update for a new record" do
16311642
object = TestUser.new(username: "jd", email: "jd@example.com", first_name: "John", last_name: "Doe")
16321643

16331644
expect_raises(
@@ -1637,6 +1648,18 @@ describe Marten::DB::Model::Persistence do
16371648
object.update_columns!(username: "updated")
16381649
end
16391650
end
1651+
1652+
it "does not allow to update for a destroyed record" do
1653+
object = TestUser.create!(username: "jd", email: "jd@example.com", first_name: "John", last_name: "Doe")
1654+
object.delete
1655+
1656+
expect_raises(
1657+
Marten::DB::Errors::UnmetSaveCondition,
1658+
"Cannot update columns on a deleted record"
1659+
) do
1660+
object.update_columns!(username: "updated")
1661+
end
1662+
end
16401663
end
16411664

16421665
describe "#delete" do

src/marten/db/model/persistence.cr

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,8 @@ module Marten
224224

225225
# :ditto:
226226
def update_columns(values : Hash | NamedTuple) : Bool
227+
return false if persisted?
228+
227229
set_field_values(values)
228230
fields = local_field_db_values
229231
keys = values.keys.map(&.to_s)
@@ -262,6 +264,7 @@ module Marten
262264
# :ditto:
263265
def update_columns!(values : Hash | NamedTuple) : Bool
264266
raise Errors::UnmetSaveCondition.new("Cannot update columns on a new record") if new_record?
267+
raise Errors::UnmetSaveCondition.new("Cannot update columns on a deleted record") if deleted?
265268

266269
set_field_values(values)
267270
fields = local_field_db_values

0 commit comments

Comments
 (0)