我想返回mycollection.first.user.name
,但mycollection
或mycollection.first
可能为零。以下代码很难看,但有效:
if mycollection && mycollection.first && mycollection.first.user
mycollection.first.user.name
end
Ruby方式是什么?
答案 0 :(得分:0)
如果您正在使用Rails,它会向Object
添加一个名为try
的方法,这可能有所帮助:
mycollection.try(:first).try(:user).try(:name)
这将依次调用first
,user
和name
,但如果链中的任何值为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