0

我目前正在尝试干掉这个初始的详细代码:

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

这是我的初步尝试:

  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

但是,当我在控制台中运行此代码时,如下所示:

p.tasks_for_week(Date.today.cweek, :plant_out, :sow_out])

我得到了一个意想不到的结果......即使不需要种植植物,我仍然会返回一个包含两个任务名称的数组( [:plant_out, :sow_out]

谁能让我知道我将如何清理它并让 tasksforweek 方法返回预期结果?

TIA

4

3 回答 3

1

您的方法正在返回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
于 2009-02-14T23:51:54.293 回答
1

上面要注意的一件事是,它self[task_name]似乎从数据库中获取原始数据,而忽略了您可能编写的任何自定义 getter 方法。

如果您想使用自定义 getter,或者如果您有任何想要作为属性处理的方法,您可以使用self.send(task_name)代替self[task_name].

于 2009-02-15T01:53:54.080 回答
0

这是稍微修改过的代码,其中有一个新的条件方法。

  def whole_range_exists?(method_name)
        self["#{method_name}_week_min"] && self["#{method_name}_week_max"]
      end

      def week_range_for_task(task_name)
        self["#{task_name}_week_min"]..self["#{task_name}_week_max"]
      end

      def tasks_for_week(week, *task_names)
        task_names.find_all do |task_name|
          whole_range_exists?(task_name) && week_range_for_task(task_name).include?(week)
        end
      end
于 2009-02-15T15:05:31.683 回答