Я бы просто использовал комбинацию командной строки и соглашения.
Если указан фильтр, используйте его для фильтрации данных
Я полагаю, вы бы указали фильтр в командной строке? Так вы бы вызвали приложение, как это?
ruby dataprocessor.rb custom_filter
Если это так, вы можете определить «api», в котором имя класса должно совпадать с тем, что было передано - в точности так, как вы описали в своем примере.
Чтобы продвинуться еще дальше, у вас может быть логика, которая ищет класс CustomFilter
, используя ruby's defined?
, и, если он не найден, ищите custom_filter.rb
(или любые подходящие варианты) и попытайтесь загрузить этот файл, затем повторите попытку.
Это дает вам большую расширяемость, поскольку вы можете написать столько классов фильтров, сколько захотите, поместить их в свои собственные файлы .rb и поместить их в любое место, где ruby сможет их найти. Вам также не нужно иметь заранее определенные константы, единственными ограничениями будут
- Имя класса должно соответствовать (вариант) имени файла - это соглашение в ruby, так что вы, вероятно, уже делаете это в любом случае.
- он должен иметь какой-то предопределенный метод, такой как ваш
do_filter
метод
Кстати, это очень похоже на то, что делает rails для запроса ваших моделей, и поэтому вы можете просто использовать SomeModel
, не всегда сначала require app/models/some_model
:-) `