Каков наилучший способ реорганизовать логику проверки и регулярные выражения в rails?

#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. Хорошо, я буду делать простые вещи, пока это больше не станет не таким мудрым 😉 Спасибо