2017-02-21 6 views
0

В Rails для проверки информации вы можете использовать проверки или ограничения базы данных.В Rails, когда вы должны использовать проверки в отличие от ограничений базы данных?

т.е.

миграция:

t.string "name", :limit => 25 

Validation от модели:

validates_length_of :name, :maximum => 25 

Я понимаю, что валидация предотвратить форму от представления и ограничение миграции/баз данных будет препятствовать данным из экономии в базу данных. Но просто любопытно, когда вы должны использовать проверки или ограничения базы данных или оба одновременно?

+3

У меня будут разные мнения, я думаю, но я всегда делаю оба, когда это возможно. – Iceman

+2

Я думаю, что проверки повышают гибкость, легче меняются и лучше обрабатывают сообщения об ошибках ... и могут быть предпочтительнее, если вход поступает от пользователей. Оба являются безопасными, поскольку вы убедитесь, что он не войдет в вашу БД. –

+0

@KcUS_unico Обратите внимание, что проверки уникальности на моделях на самом деле не гарантируют уникальность в БД, когда у вас есть несколько потоков/процессов, запускающих ваше приложение - см. Мой ответ ниже. –

ответ

2

Validations быстро, так как они не обязательно требуют туда и обратно в базу данных (для их уникальности), прежде чем вы узнаете, действительно ли данные. Недостатком проверок является то, что даже если у вас есть проверка уникальности, он не может гарантировать 100% уникальность в базе данных. Это связано с тем, что два потока могут проверять уникальность, а затем одновременно добавлять записи в базу данных в то же время, что приводит к сбою проверки уникальности. По этой причине любые валидации уникальности всегда должны указываться в базе данных и, как правило, на модели (аналогичная проблема с наличием записи, если один поток/процесс удаляет ее сразу после того, как другой поток проверил наличие, но не вставил новую связанную запись) , В модели могут быть указаны другие форматы/длина/etc-проверки, где их легко обновить/изменить.

1

Хорошо, если вы используете ограничения на уровне базы данных, это сложнее узнать, когда это произойдет. Если вы добавите его в валидацию, это будет понятно в модели. его легче изменить, и для всех разработчиков это понятно, что есть.

Мне нравится валидация, когда-либо я могу использовать его и избежать ограничений базы данных, если я могу

Я надеюсь, что это помогает :)