我建立一個ActiveRecord模型存儲鍵/值對使用早該匹配器來測試`allow_nil`結合`uniqueness`和`scope`
實施例的表 -
|------------------------------|
| KEY | VALUE |
|----------|-------------------|
| LOCATION | San Francisco, CA |
| TITLE | Manager |
| LOCATION | New York City, NY |
|------------------------------|
這裏的模型 -
class CompanyEnum < ActiveRecord::Base
KEYS = [:title, :department, :location]
KEYS_ENUM = KEYS.map(&:to_s).map(&:upcase)
# `key` column must be one of the above - LOCATION, DEPARTMENT, or TITLE
validates(:key, inclusion: KEYS_ENUM, allow_nil: false)
# `value` can be anything, but must be unique for a given key (ignoring case)
validates(
:value,
uniqueness: { scope: :key, case_sensitive: false },
allow_nil: false
)
end
我使用shoulda matchers來寫這些驗證規範。所以在我的spec文件我有以下兩種規格 -
describe "validations" do
it { should_not allow_value(nil).for(:key) }
it { should_not allow_value(nil).for(:value) }
end
我的問題是,第一次驗證了:key
通行證,但對於:value
第二驗證失敗。根據模型定義,兩者都使用相同的allow_nil: false
選項。
1) CompanyEnum validations value should not allow value to be set to nil
Failure/Error: it { should_not allow_value(nil).for(:value) }
Expected errors when value is set to nil,
got no errors
# ./spec/models/company_enum_spec.rb:13:in `block (4 levels) in <top (required)>'
# ./spec/support/analytics.rb:4:in `block (2 levels) in <top (required)>'
是否有使用allow_nil: false
與uniqueness:
和scope:
optoins任何邏輯問題?或者它與我命名實際列:key
和:value
(因爲這些似乎足以與其他一些方法衝突)?
謝謝!
爲什麼不直接使用一個存在驗證?我認爲它由於範圍條款而變得混亂。也只是一個性能提到,但你可能想凍結每個字符串和鍵枚舉的數組,否則它們是與每個模型實例一起創建的。 – CWitty