Это - обычно лучшая практика (и почему) для проверки атрибутов в модели или в определении базы данных?
Для (тривиальное) пример:
В пользовательской модели:
validates_presence_of :name
по сравнению с в миграции:
t.string :name, :null => false
С одной стороны, включая его в базе данных кажется большим количеством гарантии от любого типа неправильных данных, крадущихся в. С другой стороны, включая его в модели делает вещи более прозрачными и легче понять путем группировки его в коде с остальной частью проверок. Я также рассмотрел выполнение обоих, но это кажется и неDRY и менее удобный в сопровождении.
Я настоятельно рекомендую сделать это в обоих местах. Выполнение этого в модели избавляет вас от запроса к базе данных (возможно, по сети), который по существу приведет к ошибке, а выполнение этого в базе данных гарантирует согласованность данных.
А также
validates_presence_of :name
не то же самое, что и
t.string :name, :null => false
. Если вы просто установили столбец NOT NULL в своей БД, вы все равно можете вставить пустое значение ( ""). Если вы используете модель validates_presence_of - вы не можете.
Рекомендуется использовать и то, и другое. Проверка модели удобна для пользователя, в то время как проверка базы данных добавляет последний компонент, который укрепляет ваш код и выявляет недостающие проверки в логике вашего приложения.
Зависит от дизайна вашего приложения. Если у вас приложение малого или среднего размера, вы можете сделать это в обоих случаях или только в модели, Но если у вас большое приложение, вероятно, ориентированное на службы или в слоях, тогда используйте базовую проверку, т.е. обязательную / допускающую значение NULL, минимальную / максимальную длину и т. Д. В базе данных, и более строгую, например шаблоны или бизнес-правила в модели.
Это варьируется. Я думаю, что простая проверка, связанная с данными (например, длина строк, ограничения полей и т. Д.), Должна выполняться в базе данных. Любая проверка, которая выполняется в соответствии с некоторыми бизнес-правилами, должна выполняться в модели.