我有大约11个这样的功能:

def pending_acceptance(order_fulfillments)
  order_fulfillments.each do |order_fulfillment|
    next unless order_fulfillment.fulfillment_time_calculator.
        pending_acceptance?; collect_fulfillments(
          order_fulfillment.status,
          order_fulfillment
        )
  end
end

def pending_start(order_fulfillments)
  order_fulfillments.each do |order_fulfillment|
    next unless order_fulfillment.fulfillment_time_calculator.
        pending_start?; collect_fulfillments(
          order_fulfillment.status,
          order_fulfillment
        )
  end
end

迭代总是相同的,但是next unless条件不同。如果你想知道的话:它是next unless;的,因为rubocop在抱怨它。有没有更好的解决方案?我讨厌这个意大利面密码。类似于将条件传递到“iterate_it”函数中之类的…
编辑:不能只传递另一个参数,因为条件有时是双重的:
def picked_up(order_fulfillments)
      order_fulfillments.each do |order_fulfillment|
        next unless
          order_fulfillment.handed_over_late? && order_fulfillment.
              fulfillment_time_calculator.pending_handover?
                collect_fulfillments(
                  order_fulfillment.status,
                  order_fulfillment
                )
      end
    end

edit2:还有一个问题:如何分割一个符号,从状态中获取用户角色?类似于:
:deliverer_started => :deliverer or 'deliverer'

最佳答案

你可以制作字符串数组

arr = ['acceptance','start', ...]

下一步:
arr.each do |method|

  define_method ( 'pending_#{method}'.to_sym ) do |order_fulfillments|
    order_fulfillments.each do |order_fulfillment|
      next unless order_fulfillment.fulfillment_time_calculator.
      send('pending_#{method}?'); collect_fulfillments(
            order_fulfillment.status,
            order_fulfillment
          )
    end
  end
end

有关define_method的更多信息

关于ruby-on-rails - 许多非常相似的功能,是否修复了意大利面条式代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39242107/

10-12 15:31