0

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

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

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

谢谢你的帮助。

4

2 回答 2

3
def default_price
    project.hourly_rate || project.person.hourly_rate || project.person.organisation.hourly_rate || user.preference.hourly_rate
end
于 2012-10-28T11:17:00.687 回答
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是 always present?,那么您可以进一步重构:

def default_price
  [
    project,
    project.person,
    project.person.organisation,
    user.preference,
  ]
  .find{|x| x.hourly_rate.present?}.hourly_rate
end
于 2012-10-28T16:10:22.477 回答