我創建了一對模型:狀態和國家。他們有幾個字段和一個FK關係:我的唯一性驗證未運行。我錯過了什麼?
+-------+ +---------+
| State +----<>+ Country +
+-------+N .. 1+---------+
作爲country
的belongs_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
模型)和預期失敗(而不是與除外)。
我在這裏錯過了什麼?
這不是問題的答案。我的問題不是關於例外,而是關於驗證*通過*而不是失敗。 –
但驗證沒有通過...它由於RecordNotUnique而失敗 - 上面的鏈接/報價來自Rails API中的validates_uniqueness_of# –
編號如果我在控制檯'State.new(iso_abbr:' ak',country:us,name:'Cucaracha')。valid?'驗證通過(即返回'true')。 –