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が常に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 に答える