Я строит модель ActiveRecord для таблицы, которая хранит пары ключ/значениеИспользование Shoulda matchers для тестирования `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 написать спецификации для этих проверок. Так что в моем файле спецификации у меня есть следующие две функции -
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