I’m currently trying to DRY up this initial verbose code:
def planting_dates_not_nil? !plant_out_week_min.blank? || !plant_out_week_max.blank? || !sow_out_week_min.blank? || !sow_out_week_max.blank? end def needs_planting?(week) if !plant_out_week_min.blank? && !plant_out_week_max.blank? (plant_out_week_min..plant_out_week_max).include? (week) end end def needs_sowing?(week) if !sow_out_week_min.blank? && !sow_out_week_max.blank? (sow_out_week_min..sow_out_week_max).include? (week) end end def needs_harvesting?(week) if !harvest_week_min.blank? && !harvest_week_max.blank? (harvest_week_min..harvest_week_max).include? (week) end end
here’s my intial attempt:
def tasks_for_week(week,*task_names) task_names.each do |task_name| to_do_this_week = [] unless read_attribute(task_name).nil? if (read_attribute('#{task_name}_week_min')..read_attribute('#{task_name}_week_max')).include? (week) to_do_this_week << task_name end end end end
However, when I run this code in the console as follows:
p.tasks_for_week(Date.today.cweek, :plant_out, :sow_out])
I get an unexpected result…even though the plant does not need to be planted out, I still get an array of both task names returned ( [:plant_out, :sow_out]
Can anyone let me know how I’d clean this up and have the tasksforweek method return the expected results?
TIA
Your method is returning the result of
task_names.each.eachalways returns what it started with. So you need to actually return your result.Also, you are recreating you
to_do_this_weekarray on every iteration of the loop, which would wipe it clean.Or this:
But I think this is probably your best best:
That last one uses
find_allwhich iterates over an array and will return a new array populated with any objects that the block return a true value for.Lastly, your conditional logic is a bit crazy too. You can use the
[]accessors for active record fields in a dynamic way. And it’s usually clearer to use the positive case instead of the double negative ofunless something.nil?. And if this is a common use for creating a range, it might be best to farm that out to a method:Making the whole method: