2016-05-02 57 views
0

讓我先說這個,說鐵軌樂觀鎖定的行爲似乎正在工作,我只是想明白爲什麼我的單元測試返回它的價值。在運行我的單元測試時,檢查lock_version是否遞增,並且assert_not_equal我通過了測試。當我將測試設置爲assert_equal時,失敗,但消息返回nil而不是0.爲什麼?樂觀鎖定開始於零?

lock_version細節 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

UPDATE

當我將測試更改爲assert_not second.save時,它失敗。我的理解是樂觀鎖定應該防止保存(更新)第二個值。爲什麼不可以呢?

按照克里斯蒂安的建議first.lock_version返回「」,而不是0

+0

在找到要驗證數據庫缺省值爲0的對象之後,能否打印您的'lock_version'?否則,樂觀鎖定會使它「無」直到成功更新。 –

+0

查找對象後,打印first.lock_version時不返回任何內容。即使我在我的工廠中將其指定爲0,它仍然沒有出現。 在SQL Developer中查看模型我得到的默認值爲0的確認,但是您的打印建議讓我懷疑我是否缺少其他東西。 – CheeseFry

回答

0

當我產生我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並重新創建數據庫DID中的對象來修復它。不知道這是否是已知的錯誤,但是我的一位同事將有機會與正在使用增強型適配器gem的人交談,看看我們是否能夠獲得更多見解。

隨着上述變化,樂觀鎖定行爲正在發揮作用。 N.B.我最初使用的遷移源自railscast