我想知道是否有办法以更优雅的方式编写此代码:
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
条件和返回值之间有很多重复。有没有更好的方法来编码呢?
感谢您的帮助。
答案 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