Добавление проверки в существующую модель базы данных - PullRequest
0 голосов
/ 09 февраля 2019

Я младший разработчик (Ruby on Rails 5), в настоящее время реализующий новую проверку существующей модели.Проверка проходит только в том случае, если рассматриваемый атрибут не превышает 50 слов.

  validates_length_of :reason, maximum: 50, too_long: 'Please reduce to 50 words or less',
                  tokenizer: ->(str) { str.split(/\s+/) }

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

До сих пор мое исследование дало опцию on: :create, которая кажется многообещающей, но я хотел опытногообратная связь о том, могу ли я столкнуться с проблемами / ошибками в будущем.

Даст ли этот вариант проверки именно то поведение, которое я хочу?

Спасибо, ребята!

Ответы [ 3 ]

0 голосов
/ 09 февраля 2019

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

Это то, что вы хотите?Или вы любите брать более старые записи> 50 слов даже при обновлении?Если вам действительно нужно, вы можете создать новый атрибут, называемый, например, legacy, для которого вы установите значение true для любых существующих записей.Вы можете пропустить проверку для любой устаревшей записи.Но я думаю, что это немного против.

0 голосов
/ 09 февраля 2019

Я бы сделал что-то вроде этого:

validates_length_of :reason, maximum: 50,
                             tokenizer: ->(str) { str.split(/\s+/) },
                             too_long: 'Please reduce to 50 words or less',
                             unless: -> { reason_was && reason_was.split(/\s+/).size > 50 }

Это выполняет проверку, если атрибут reason ранее не присутствовал и был больше 50. Это означает, что новые записи никогда не имеют причина количество слов больше 50, потому что у них нет предыдущего значения причина .И старые записи могут иметь только причина количество слов больше 50, если оно ранее было больше, в противном случае применяется максимум 50.

При этом используются методы, сгенерированные методами, предоставленными ActiveModel :: Грязная .

0 голосов
/ 09 февраля 2019

Да, вы на правильном пути, у вас есть несколько вариантов работы с существующими данными.

Вы должны добавить проверку к on: create, потому что вы не хотите, чтобы люди (или рабочие места)), которые изменяют другие несвязанные поля в отдельном процессе, чтобы иметь ошибку, потому что причина является недопустимой и слишком длинной.

Однако, если вы добавляете только on: create, это означает, что кто-то может создать причину, используя менее 10 слов, а затем обновить запись в пользовательском интерфейсе обновления до 60 слов и нарушить проверку.Также рассмотрите возможность добавления той же проверки с if: :reason_changed?, чтобы предотвратить обновления, нарушающие правила проверки, налагаемые на создание.

Другое разумное решение, которое вы можете использовать в этом случае, - выполнить миграцию данных для существующих записей, дляВ каждой записи, которая нарушает проверку, вы сокращаете слова до 49, добавляете ... в конце и сохраняете его.Это может привести к потере информации, однако это будет означать, что вы можете применять эту проверку всегда в 100% случаев.Иногда исправление данных является отличным вариантом для написания меньшего количества кода.

Независимо от того, что вы выберете, убедитесь, что у вас есть тесты, чтобы повысить уверенность в том, что код выполняет то, что, по вашему мнению, должно быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...