首页 > 解决方案 > 根据多个条件将多个项目推送到数组的干净方法

问题描述

代码如下。

    def call
      banners = []
      banners.push(banner1) if condition1?
      banners.push(banner2) if condition2?
      banners.push(banner3) if condition3?
      banners
    end

    def banner1
      {
        type: BANNER1,
        display_value: 'banner_1'
      }
    end

有没有更简洁的方法来写这个?可能是更少的代码行?

标签: ruby-on-rails

解决方案


不成为人类编译器的一种方法是使用循环:

def call
  [:banner1, :banner2, :banner3].filter_map do |name|
    send(name) if send("#{name}?")
  end
end

这假定您要调用的方法的名称和预判方法之间存在某种相关性。

如果不使用哈希代替:

def call
  {
    banner1: :condition1?,
    banner2: :condition2?,
    banner3: :condition3?
  }.filter_map do |method, condition|
    send(method) if send(condition)
  }
end

当然,这确实引出了一个问题,这些方法是否可以通过 DRY:ed 变成一个带参数的方法,或者是否需要其他重构。


推荐阅读