Ruby/rails/цепные методы

Учитывая следующий пример:

apply_filter_a(
 apply_filter_b(
  apply_filter_c(
    active_record_dataset
  )
 )
)

...

def apply_filter_a(records)
  # some more complex than 
  ...
end

def apply_filter_b(records)
  # some other complex logic filtering the active record dataset
  ...
end

def apply_filter_c(records)
  # some other complex logic filtering the active record dataset
  ...
end

Как упростить синтаксис вложенного метода (apply_filter_a(apply_filter_b(...)) более простым способом? можно ли применять методы из массива методов?

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
0
25
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете выполнить такую ​​операцию складывания с помощью Enumerable#inject.

Во-первых, нам нужен массив методов. Мы можем получить их, используя method.

my_filters = [method(:apply_filter_c), method(:apply_filter_b), method(:apply_filter_a)]

Затем мы можем использовать inject в списке фильтров для применения к начальному значению.

my_filters.inject(active_record_dataset) { |acc, f| f.call acc }
Ответ принят как подходящий

Существует метод yield_self, или вы можете использовать его псевдоним then. Вы можете направлять вызовы один за другим, каждый из ваших методов фильтра должен возвращать отношение активной записи.

apply_filter_a(active_record_dataset)
  .then { |records| apply_filter_b(records) }
  .then { |records| apply_filter_c(records) }

Другие вопросы по теме