Источник данных, с которым я работаю, ужасен. В некоторых местах, где вы ожидаете целые числа, вы получаете «Три». В поле «Номер телефона» может появиться «номер телефона — xxx». Некоторые поля просто пусты.
Это нормально, так как я анализирую каждое поле, так что «Три» в моей модели окажется целым числом 3, телефонные номера (и тому подобное) будут извлечены с помощью регулярного выражения. Пользователи сервиса ЗНАЮТ, что данные отрывочны и неполны, поскольку это досадный факт того, как поддерживается наш источник данных, и мы ничего не можем с этим поделать, кроме как активизировать нашу игру по анализу! Кроме того, мы медленно создаем собственную версию данных по мере того, как анализируем все больше и больше исходных данных, но пока этого бедного источника достаточно.
Таким образом, пользователи выбирают данные, которые они хотят проанализировать, а мы делаем все возможное, возвращая неполную/неправильную модель. Теперь окончательная модель, которую мы хотим сохранить, должна быть проверена — есть определенные поля, которые не могут быть нулевыми, определенные строки должны соответствовать формату и так далее.
Поток приложения:
- Пользователь сообщает сервису, какие данные анализировать.
- Сервис отключается и собирает данные, анализирует все, что может, и возвращает частичную модель с любыми данными, которые он может получить.
- Мы отображаем данные для пользователя, позволяя ему вносить исправления и заполнять любые обязательные поля, для которых данные не были собраны.
- Эти скорректированные пользователем данные должны быть сохранены и, следовательно, проверены.
- Если проверка не пройдена, снова покажите данные, чтобы пользователь мог внести исправления, смыть и повторить.
Каков наилучший способ получить модель, которая изначально потенциально полностью недействительна или не содержит данных, но которую в конечном итоге необходимо проверить? Два способа, о которых я подумал (и частично реализовал):
- 2 модели - модель данных с проверками и т. д. и модель UnconfirmedData без проверок. Исходные данные помещаются в модель UnconfirmedData до тех пор, пока пользователь не внесет свои исправления, после чего они помещаются в модель данных и предпринимается попытка проверки.
- Одна модель с пометкой «подтвержденные данные», при которой проверка выполняется вручную, а не проверка Rails.
На практике я склоняюсь к использованию 2 моделей, но я новичок в Rails, поэтому я подумал, что есть более приятный способ сделать это, у Rails есть привычка удивлять меня вот так :)