返回前检查多个条件

时间:2012-10-08 21:09:06

标签: ruby-on-rails ruby

我想返回mycollection.first.user.name,但mycollectionmycollection.first可能为零。以下代码很难看,但有效:

if mycollection && mycollection.first && mycollection.first.user
  mycollection.first.user.name
end

Ruby方式是什么?

3 个答案:

答案 0 :(得分:0)

如果您正在使用Rails,它会向Object添加一个名为try的方法,这可能有所帮助:

mycollection.try(:first).try(:user).try(:name)

这将依次调用firstusername,但如果链中的任何值为nil,则只会返回{{1}没有抛出异常。

如果你没有使用Rails,你可以很容易地自己定义:

nil

答案 1 :(得分:0)

有些人对try()并不太热衷,但这肯定是你可能喜欢的一种方法。

name = mycollection.try(:first).try(:user).try(:name)
如果任何内容为零,

名称将为nil,或者将返回name的值。

此外,您可能想要重构您的模型,以便您可以调用以下内容:

item.user_name

class ItemClass
  def user_name
    user.try(:name)
  end
end

项目是集合中的第一个。

name = if mycollection && item = mycollection.first
  item.user_name
end

答案 2 :(得分:0)

在纯Ruby中,你可以这样做:

if mycollection && mycollection.first.respond_to?(:user)
  mycollection.first.user.name
end

那是因为如果mycollection是一个空数组,mycollection.first将返回nil:

irb(main):002:0> nil.respond_to?(:user)
false