Я создал пару моделей: State и Country. Они имеют несколько полей и отношения один FK:Моя проверка подлинности не выполняется. Что мне не хватает?
+-------+ +---------+
| State +----<>+ Country +
+-------+N .. 1+---------+
Being 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
, так что взрыв заставляет меня думать, что никакая проверки не является (или, возможно, проверка проходит!).
My Rails версия 4.2.0.
Редактировать: Подтверждено! Проверка завершена . С моей точки зрения, это должно потерпеть неудачу. Выполняя это в консоли: State.new(iso_abbr: :ak, country: us, name: 'Foo').valid?
Я получаю true
в результате, пока ожидаю false
.
Edit 2: Ото, если я пишу Country.create(iso_abbr: :US, name: 'Foo')
проверки работает, как ожидалось (iso_abbr
уникален сам по себе в Country
модели) и не как ожидалось (а не исключением).
Что мне здесь не хватает?
Это не ответ на вопрос.Мой вопрос был не в отношении исключения, а в отношении проверки * передачи * вместо отказа. –
Но проверка не проходит ... он не работает из-за RecordNotUnique - ссылка/цитата сверху - это 'validates_uniqueness_of' в Rails API –
Нет. Если я попробую это в консоли' State.new (iso_abbr: ' ak ', country: us, name:' Cucaracha '). valid? 'проходит проверку (т.е. возвращает' true'). –