首先,让我说rails乐观锁定的行为似乎是有效的,我只是想了解为什么我的单元测试返回它的值。在运行我的单元测试时,要检查lock_version是否增加,而assert_not_equal则得到一个通过的测试。当我将测试设置为assert_equal时,它会失败,但是消息返回的是零而不是0。为什么?
lock_version details Data_type => Number(38,0), Nullable => No, Data_default => 0
单元测试
test "optimistic locking increments" do
invoice = create(:invoice)
first = Invoice.find(invoice.invoice_id)
second = Invoice.find(invoice.invoice_id)
first.currency = "GBP"
second.currency = "EUR"
first.save
second.save
assert_equal first.lock_version, second.lock_version
end预期:无实际:1
更新
当我将测试更改为assert_not second.save时,它会失败。我的理解是乐观锁定应该阻止保存(更新)第二个值。为什么不是呢?
根据Kristján的建议,first.lock_version返回"",而不是0
发布于 2016-05-03 16:55:09
在生成我的lock_version列时,我使用了以下迁移。
class AddLockVersionToInvoice < ActiveRecord::Migration
def change
add_column :ch_invoice, :lock_version, :integer, default: 0, null: false
end
end宝石
ruby-oci8 (2.2.1) activerecord-oracle_enhanced-adapter (1.6.7, 1.6.6)
不知怎么的,这个组合不管用。删除null:false并在数据库中重新创建对象确实修复了它。不确定这是否是一个已知的错误,或者不是,但我的一个同事将有机会与一个在增强适配器gem上工作的人交谈,看看我们是否能获得更多的洞察力。
通过上述更改,乐观锁定行为正在发挥作用。注:我最初使用的迁移起源于这个铁轨。
https://stackoverflow.com/questions/36984388
复制相似问题