提交 1e2f63db 编写于 作者: R Rafael França 提交者: Ryuta Kamizono

Merge pull request #28914 from bogdanvlviv/fix-touch-with-optimistic-locking

Fix ActiveRecord::Persistence#touch with locking
上级 e498052c
* `ActiveRecord::Persistence#touch` does not work well when optimistic locking enabled and
`locking_column`, without default value, is null in the database.
*bogdanvlviv*
* Fix destroying existing object does not work well when optimistic locking enabled and
`locking column` is null in the database.
......
......@@ -522,7 +522,7 @@ def touch(*names, time: nil)
if locking_enabled?
locking_column = self.class.locking_column
scope = scope.where(locking_column => _read_attribute(locking_column))
scope = scope.where(locking_column => read_attribute_before_type_cast(locking_column))
changes[locking_column] = increment_lock
end
......
......@@ -226,10 +226,33 @@ def test_lock_without_default_sets_version_to_zero
assert_equal 0, t1.lock_version_before_type_cast
end
def test_touch_existing_lock_without_default_should_work_with_null_in_the_database
ActiveRecord::Base.connection.execute("INSERT INTO lock_without_defaults(title) VALUES('title1')")
t1 = LockWithoutDefault.last
assert_equal 0, t1.lock_version
assert_nil t1.lock_version_before_type_cast
t1.touch
assert_equal 1, t1.lock_version
end
def test_touch_stale_object_with_lock_without_default
t1 = LockWithoutDefault.create!(title: "title1")
stale_object = LockWithoutDefault.find(t1.id)
t1.update!(title: "title2")
assert_raises(ActiveRecord::StaleObjectError) do
stale_object.touch
end
end
def test_lock_without_default_should_work_with_null_in_the_database
ActiveRecord::Base.connection.execute("INSERT INTO lock_without_defaults(title) VALUES('title1')")
t1 = LockWithoutDefault.last
t2 = LockWithoutDefault.last
t2 = LockWithoutDefault.find(t1.id)
assert_equal 0, t1.lock_version
assert_nil t1.lock_version_before_type_cast
......@@ -286,7 +309,7 @@ def test_lock_with_custom_column_without_default_should_work_with_null_in_the_da
ActiveRecord::Base.connection.execute("INSERT INTO lock_without_defaults_cust(title) VALUES('title1')")
t1 = LockWithCustomColumnWithoutDefault.last
t2 = LockWithCustomColumnWithoutDefault.last
t2 = LockWithCustomColumnWithoutDefault.find(t1.id)
assert_equal 0, t1.custom_lock_version
assert_nil t1.custom_lock_version_before_type_cast
......
......@@ -459,11 +459,13 @@
create_table :lock_without_defaults, force: true do |t|
t.column :title, :string
t.column :lock_version, :integer
t.timestamps null: true
end
create_table :lock_without_defaults_cust, force: true do |t|
t.column :title, :string
t.column :custom_lock_version, :integer
t.timestamps null: true
end
create_table :magazines, force: true do |t|
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册