提交 e30d701a 编写于 作者: S Sean Griffin

Don't mess with `column_defaults` when optimistic locking is enabled

上级 e7a8fda0
......@@ -308,10 +308,10 @@ class Base
include Integration
include Validations
include CounterCache
include Locking::Optimistic
include Locking::Pessimistic
include Attributes
include AttributeDecorators
include Locking::Optimistic
include Locking::Pessimistic
include AttributeMethods
include Callbacks
include Timestamp
......
......@@ -53,6 +53,11 @@ module Optimistic
included do
class_attribute :lock_optimistically, instance_writer: false
self.lock_optimistically = true
is_lock_column = ->(name, _) { lock_optimistically && name == locking_column }
decorate_matching_attribute_types(is_lock_column, :_optimistic_locking) do |type|
LockingType.new(type)
end
end
def locking_enabled? #:nodoc:
......@@ -141,7 +146,7 @@ def locking_enabled?
# Set the column to use for optimistic locking. Defaults to +lock_version+.
def locking_column=(value)
@column_defaults = nil
clear_caches_calculated_from_columns
@locking_column = value.to_s
end
......@@ -162,18 +167,26 @@ def update_counters(id, counters)
counters = counters.merge(locking_column => 1) if locking_enabled?
super
end
end
end
def column_defaults
@column_defaults ||= begin
defaults = super
class LockingType < SimpleDelegator
def type_cast_from_database(value)
# `nil` *should* be changed to 0
super.to_i
end
if defaults.key?(locking_column) && lock_optimistically
defaults[locking_column] ||= 0
end
def changed?(old_value, *)
# Ensure we save if the default was `nil`
super || old_value == 0
end
defaults
end
end
def init_with(coder)
__setobj__(coder['subtype'])
end
def encode_with(coder)
coder['subtype'] = __getobj__
end
end
end
......
......@@ -272,6 +272,13 @@ def test_removing_has_and_belongs_to_many_associations_upon_destroy
assert p.treasures.empty?
assert RichPerson.connection.select_all("SELECT * FROM peoples_treasures WHERE rich_person_id = 1").empty?
end
def test_yaml_dumping_with_lock_column
t1 = LockWithoutDefault.new
t2 = YAML.load(YAML.dump(t1))
assert_equal t1.attributes, t2.attributes
end
end
class OptimisticLockingWithSchemaChangeTest < ActiveRecord::TestCase
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册