我在帮助程序中有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,因为它还没有被定义。有没有办法一次性将项目定义为所有方法中的空数组?