Ваш метод возвращает результат task_names.each
. each
всегда возвращает то, с чего все началось. Так что вам действительно нужно вернуть свой результат.
Кроме того, вы воссоздаете свой массив to_do_this_week
на каждой итерации цикла, что приведет к его очистке.
def tasks_for_week(week, *task_names)
to_do_this_week = []
task_names.each do |task_name|
if some_condition
to_do_this_week << task_name
end
end
to_do_this_week
end
Или это:
def tasks_for_week(week, *task_names)
returning [] do |to_do_this_week|
task_names.each do |task_name|
if some_condition
to_do_this_week << task_name
end
end
end
end
Но я думаю, что это, вероятно, ваш лучший лучший:
def tasks_for_week(week, *task_names)
task_names.find_all do |task_name|
some_condition
end
end
Последний использует find_all
, который перебирает массив и возвращает новый массив, заполненный любыми объектами, для которых блок возвращает истинное значение.
Наконец, ваша условная логика тоже немного сумасшедшая. Вы можете использовать аксессоры []
для активных полей записи в динамическом режиме. И обычно яснее использовать положительный регистр вместо двойного отрицательного unless something.nil?
. И если это обычное использование для создания диапазона, может быть лучше использовать это для метода:
def week_range_for_task(task)
self["#{task_name}_week_min"]..self["#{task_name}_week_max"]
end
...
self[task_name] && week_range_for_task(task_name).include?(week)
Создание всего метода:
def tasks_for_week(week, *task_names)
task_names.find_all do |task_name|
self[task_name] && week_range_for_task(task_name).include?(week)
end
end