2016-05-17 3 views
0

Я создал пару моделей: State и Country. Они имеют несколько полей и отношения один FK:Моя проверка подлинности не выполняется. Что мне не хватает?

+-------+  +---------+ 
| State +----<>+ Country + 
+-------+N .. 1+---------+ 

Being countrybelongs_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 модели) и не как ожидалось (а не исключением).

Что мне здесь не хватает?

ответ

1

Это должно быть результатом различия в двух символах, используемых в OP: :ak и :AK не будут видны такими же БД, как Postgres, из-за которого выполняются схожие с регистром сравнения.

+0

Это не ответ на вопрос.Мой вопрос был не в отношении исключения, а в отношении проверки * передачи * вместо отказа. –

+0

Но проверка не проходит ... он не работает из-за RecordNotUnique - ссылка/цитата сверху - это 'validates_uniqueness_of' в Rails API –

+0

Нет. Если я попробую это в консоли' State.new (iso_abbr: ' ak ', country: us, name:' Cucaracha '). valid? 'проходит проверку (т.е. возвращает' true'). –

Смежные вопросы