2016-05-17 41 views
0

我創建了一對模型:狀態和國家。他們有幾個字段和一個FK關係:我的唯一性驗證未運行。我錯過了什麼?

+-------+  +---------+ 
| State +----<>+ Country + 
+-------+N .. 1+---------+ 

作爲countrybelongs_to協會(country_id列)。

國家和國家都有內部代碼,國家在(code, country)上有唯一性約束。

當我在控制檯中運行以下命令:

us = Country.find_by_iso_abbr :US 
ak = State.find_by iso_abbr: :AK, country: us 
State.create(iso_abbr: :ak, country: us, name: 'Foo') 

這些行如預期的實際工作。兩個表中的iso_abbr代表我所談論的實際代碼字段。

執行時,此代碼按預期爆炸(ActiveRecord::RecordNotUnique)。

但是我想包含一個模型驗證器,所以數據庫級別的爆炸永遠不會通過模型達到。我試過是:

型號/ country.rb
省略代碼替換爲省略號,因爲它是不相關的這個問題

class Country < ... 
    ... 
    validates_uniqueness_of :iso_abbr 
    ... 
end 

型號/ state.rb
省略的代碼替換爲省略號,因爲它與此問題無關

class State < ... 
    ... 
    validates_uniqueness_of :iso_abbr, scope: :country 
    ... 
end 

並再次運行3線的時候,我想到了.create一句返回一個無效的,未保存的對象(因爲驗證應該失敗),而不是與ActiveRecord::RecordNotUnique爆炸,因爲這爆炸讓我覺得,沒有被驗證正在執行(或者驗證通過!)。

我的Rails版本是4.2.0。

編輯:確認!驗證是通過。從我的角度來看,它應該失敗。通過在控制檯執行此操作:State.new(iso_abbr: :ak, country: us, name: 'Foo').valid?我得到true作爲結果,而我期望false

編輯2:OTOH如果我寫Country.create(iso_abbr: :US, name: 'Foo')確認運行正常(iso_abbr是唯一被自己Country模型)和預期失敗(而不是與除外)。

我在這裏錯過了什麼?

回答

1

它應該是在OP中使用的兩個符號的差異的結果::ak:AK由於運行區分大小寫比較而不會被像Postgres這樣的DB看到。

+0

這不是問題的答案。我的問題不是關於例外,而是關於驗證*通過*而不是失敗。 –

+0

但驗證沒有通過...它由於RecordNotUnique而失敗 - 上面的鏈接/報價來自Rails API中的validates_uniqueness_of# –

+0

編號如果我在控制檯'State.new(iso_abbr:' ak',country:us,name:'Cucaracha')。valid?'驗證通過(即返回'true')。 –