如何合并以下两个if条件?

时间:2017-09-07 12:18:36

标签: ruby-on-rails ruby

if array1.present?
  method_call(array1[:ids])
end

if array2.present?
  method_call(array2[:ids])
end

如何使上述代码更简单或一行?

4 个答案:

答案 0 :(得分:1)

[array1, array].select(&:present?)
               .map { |a| a[:ids] }
               .each(&method(:method_call))

答案 1 :(得分:0)

在ruby中有很多方法可以做这种事情。这是一个:

[array1, array2].compact.each do |array|
  method_call(array[:ids])
end

compact会将nils从数组中删除。

...替代地

[array1, array2].each do |array|
  method_call(array[:ids]) if array
end

编辑:单行?

[array1, array2].compact.each {|a| method_call(a[:ids]) }

虽然我应该指出,如果那些实际上是数组,那么:id不是有效的索引。如果它们是哈希值,则此示例更有意义。

答案 2 :(得分:0)

这可能是相同的,但有点简单,

[array1, array2].each do |a|
  method_call(a[ids]) if a.present?
end

答案 3 :(得分:0)

我认为您的代码非常好,因为它易于阅读和理解。因此,我不确定它是否会因为缩短而改善。

如果我不得不更改代码(也许我们的示例只是一长串方法调用和条件的一部分),我会考虑:

  • 重新排序方法调用和条件

    method_call(array1[:ids]) if array1.present?
    method_call(array2[:ids]) if array2.present?
    
  • 或引入辅助方法:

    def call_method(array)
      method_call(array[:ids]) if array.present?
    end
    
    call_method(array1)
    call_method(array2)