0

这段代码有效,但我觉得有一种更简洁的方法可以做到这一点,而无需所有重复:

def check_out_time                                                                               
  if super                                                                                                
    super                                                                                     
  elsif try(:registration).try(:program).try(:departure_time)                                    
    registration.program.departure_time                                                          
  else                                                                                           
    Settings.default_check_out_time                                                                                           
  end
end

该模型有一个名为的属性check_out_time,此代码基本上是说“如果未指定签出时间,请尝试注册程序的出发时间,如果不存在,则使用默认设置”

有没有更好的方法来写这个?也许通过使用||运算符?

4

2 回答 2

2

我宁愿写:

def check_out_time
    super || departure_time || Settings.default_check_out_time
end

def departure_time
    registration.try(:program).try(:departure_time)
end
于 2013-04-29T19:27:48.223 回答
1

看来您至少调用了一次 super,并且可能调用了两次:

if super
  super

剩下的可以简化为:

else
  try(:registration).try(:program).try(:departure_time) || Settings.default_check_out_time
end

我不喜欢每个表达式一个以上的 .try 。所以另一种写法是避免链式尝试方法:

else
  depart_time = registration.program.departure_time rescue nil
  depart_time || Settings.default_check_out_time
end

在这一点上,我将使用 nil 提取该行到一个单独的方法调用中。

于 2013-04-29T16:35:41.563 回答