如何在Ruby中最小化条件和返回值之间的重复?

时间:2012-10-28 11:13:55

标签: ruby-on-rails ruby

我想知道是否有办法以更优雅的方式编写此代码:

def default_price
  if project.hourly_rate.present?
    project.hourly_rate
  elsif project.person.hourly_rate.present?
    project.person.hourly_rate    
  elsif project.person.organisation.hourly_rate.present?
    project.person.organisation.hourly_rate
  else
    user.preference.hourly_rate
  end
end

条件和返回值之间有很多重复。有没有更好的方法来编码呢?

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

def default_price
    project.hourly_rate || project.person.hourly_rate || project.person.organisation.hourly_rate || user.preference.hourly_rate
end

答案 1 :(得分:1)

def default_price
  [
    project.hourly_rate,
    project.person.hourly_rate,
    project.person.organisation.hourly_rate,
  ]
  .find(&:present?) ||
  user.preference.hourly_rate
end

或者,重构一下:

def default_price
  [
    project,
    project.person,
    project.person.organisation,
  ]
  .find{|x| x.hourly_rate.present?}.hourly_rate ||
  user.preference.hourly_rate
end

此外,如果user.preference.hourly_rate始终为present?,那么您可以进一步重构:

def default_price
  [
    project,
    project.person,
    project.person.organisation,
    user.preference,
  ]
  .find{|x| x.hourly_rate.present?}.hourly_rate
end