#ruby-on-rails #ruby #regex #validation #refactoring
#ruby-on-rails #ruby #регулярное выражение #проверка #рефакторинг
Вопрос:
Допустим, у вас есть несколько моделей, которые содержат поля для адреса, почтового индекса, провинции / страны, номера телефона и т.д.
Это довольно распространенные поля, которые имеют специальные проверки регулярных выражений. Если вы добавляете одинаковые проверки и регулярные выражения в каждую модель, это дублируется. Кроме того, тесты дублируются. Это попахивает 😉
Каков наилучший подход с использованием ruby и rails для рефакторинга подобных вещей? Модуль?
В Java с Hibernate мы бы использовали класс Component для хранения адреса, а затем поместили бы туда логику проверки. Каждая модель, которая хотела использовать адрес, просто содержала бы его, и она получит всю логику проверки адреса.
Каков подход к достижению того же самого в rails? Спасибо!
Комментарии:
1. Идея вашего модуля кажется мне правильной. Я бы создал модуль с соответствующей функциональностью, а затем вставил его.
2. Вы также могли бы рассмотреть возможность переноса столбцов адресов в отдельную таблицу и использования полиморфной ассоциации (т.Е.
belongs_to :addressable, :polymorphic => true
)3. Возможно, вы даже захотите создать свой собственный класс, а не модуль.
4. Могу ли я создать модель адресов без создания отдельной таблицы? Создание таблицы кажется излишним и приведет к ненужным проблемам с производительностью. Это решение в основном отражало бы подход, основанный на Java
5. Как насчет простого старого объекта Ruby, а не модели?
Ответ №1:
Создайте пользовательские средства проверки для различных типов необходимых вам проверок, затем вызовите их в ваших классах модели.
Например:
класс PostalCodeValidator < ActiveModel::EachValidator определить validate_each(запись, имя_пользователя, значение) если значение = ~ / ^ d{5} $/ запись.ошибки[имя_позиции] << "должен быть 5-значный почтовый индекс" завершение завершение
Теперь используйте эту проверку в каждом классе модели и для каждого атрибута, который является почтовым индексом. Например, если у вашего клиента есть атрибут postal_code:
класс Customer < ActiveRecord::Base проверяет:postal_code, :postal_code => true завершение
Там больше деталей и множество необычных опций, поэтому я предлагаю поискать в Google пользовательские средства проверки rails.
Комментарии:
1. стоит ли также реорганизовывать фактические поля в модуль или что-то в этом роде? Например … адрес, почтовый индекс и province_id в основном всегда группируются вместе.
2. Вы собираетесь добавить какую-то серьезную функциональность к этому модулю или просто использовать его как своего рода структуру? Я бы сделал это, если бы у меня было более двух классов, которые используют эти поля, сгруппированные вместе, и если бы с этой группой было связано несколько методов. Критерием для принятия решения imo является то, действительно ли вы упрощаете вещи или просто добавляете сложности.
3. Хорошо, я буду делать простые вещи, пока это больше не станет не таким мудрым 😉 Спасибо