1: Это зависит от того, насколько строгим вы хотите быть и каким образом. С одной стороны, поскольку добавить в оба поля уникальное ограничение / индекс так просто и дешево (я предполагаю, что это традиционная схема SQL), почему бы и нет? С другой стороны, некоторые приверженцы рельсов утверждают (по уважительной причине), что вам следует отказаться от специфики любого поставщика базы данных и применить все ограничения в модели рельсов, а затем добавить индексы (а не ограничения) в качестве оптимизации производительности. Я старый skool, поэтому я предпочитаю первый, но я также пурист, поэтому я проверяю, верны ли мои модели rails и мои приложения никогда не полагаются на специфику db vendor.
В режиме 2: я бы обработал отображение ошибки валидации в слое представления, т. Е. Не зацикливался на порядке их выполнения - думайте обо всех валидациях как о атомарной операции. Затем в представлении вместо простого вывода сообщений об ошибках в том порядке, в котором они находятся, измените порядок хэширования или даже проверьте и выведите каждый ключ в явном виде. Это немного менее ремонтопригодно, в том случае, если вы добавляете новый ввод, вам необходимо обновить этот код представления. Но это незначительно по сравнению с головной болью попытки поддерживать порядок выполнения проверок. Лично я не верю, что порядок, в котором печатаются сообщения об ошибках, даже уместен, но я знаю, что некоторые люди теряют сознание.
3: Согласитесь с Себи, не редактируйте драгоценные камни или что-либо, что предоставляют драгоценные камни, и не редактируйте миграции задним числом. Добавить новую миграцию тривиально, так что просто сделайте это и переходите к интересным вещам. Если я являюсь единственным программистом в приложении, которое не запущено в производство, я воспользуюсь ярлыком, но как только оно появится или появится другой разработчик, я буду более дисциплинированным. И чем больше времени я трачу на программирование rails, я нахожу написание rails db-миграций так же легко или просто, как SQL.