Я создаю модель ActiveRecord для таблицы, в которой хранятся пары ключ/значение.
Пример -
|------------------------------|
| 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 для написания спецификаций для этих проверок. Итак, в моем файле спецификаций у меня есть следующие две спецификации:
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:
? Или это связано с тем, что я называю фактические столбцы :key
и :value
(поскольку они кажутся достаточно общими, чтобы конфликтовать с некоторыми другими методами)?
Спасибо!