如果值存在,则返回值

时间:2013-11-15 07:57:36

标签: ruby-on-rails ruby

在Ruby on Rails中,有没有更好的方法来写这个:

qty = 2
avg_price = room["price"].to_f if room["price"].present?
total_price = (avg_price * qty) if avg_price.present?

特别是第2和第3行。我发现自己经常使用if-else条件。感谢。

4 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

qty = 2
total_price = room.fetch("price").to_f * qty

但是这个代码存在问题,如果哈希中没有price字段,则会引发异常。它满足你的需求吗?

答案 1 :(得分:0)

这很难缩短,我只会这样做:

qty, avg_price, total_price = 2, nil, nil

if room["price"]
  avg_price   = Float(room["price"])
  total_price = avg_price * qty
end

答案 2 :(得分:0)

如何定义一个帮助器方法,以便您可以直接从哈希中提取浮点数:

class Hash
  def get_f key; fetch(key).to_f if key?(key) end # Or `if self[key].present?`
end

然后执行:

qty = 2
avg_price = room.get_f("price")
total_price = avg_price * qty if avg_price

答案 3 :(得分:0)

也许是一种更加面向对象的方法?这种方法可以更容易地测试代码,并且可以重复使用。

class PriceCalculator

  def init(quantity, price)
    @quantity = quantity
    @price    = price.presence && price.to_f
  end

  def total
    @price * @quantity  if @price
  end

end

total_price = PriceCalculator.new(2, room["price"]).total