共享类似代码的重构方法

时间:2017-08-19 09:48:24

标签: ruby-on-rails methods lambda refactoring

我在帮助程序中有6个方法,它们共享非常相似的代码:

module CategoriesHelper

  def item_count(category)
    items = []
    category.items.each do |item|
      if !item.completed
        items << item
      end
    end
    items.count
  end

  def total_items
    items = []
    @user.items.each do |item|
      if !item.completed && !item.content.nil?
        items << item
      end
    end
    items.count
  end

  def overdue_items
    items = []
    @user.items.each do |item|
      if (!item.completed && item.deadline_date &&
          item.deadline_date < Time.now)
        items << item
      end
    end
    items.count
  end

  def week_items
    items = []
    @user.items.each do |item|
      if (!item.completed && item.deadline_date &&
         item.deadline_date - Time.now < 7.days)
        items << item
      end
    end
    items.count
  end

  def today_items
    items = []
    @user.items.each do |item|
      if (!item.completed && item.deadline_date &&
         item.deadline_date.today?)
        items << item
      end
    end
    items.count
  end

  def completed_items(category)
    items = []
    category.items.each do |item|
      if item.completed == true
        items << item
      end
    end
    items.count
  end
end

我想知道是否有任何重构方法,因为它似乎非常严重地违反了DRY原则。每个变量唯一不同的是if语句以及是否使用了@user或category。我已经尝试将lambda放入迭代中:

Iterator = ->(object, if_statement) do
  object.items.each do |item|
    if if_statement
      items << item
    end
  end
  items.count
end

Iterator.call(@user, !item.completed && !item.content.nil?)

但是这不起作用,因为if语句包含'item',所以当我尝试调用lambda时,它不识别item,因为它还没有被定义。有没有办法一次性将项目定义为所有方法中的空数组?

0 个答案:

没有答案