3

我有一个场景,我有可选的关联。有时关联存在,有时则不存在。

当我尝试在屏幕上显示数据时遇到问题(想想一个简单的索引操作)。

考虑以下应用程序设置:

  • 项目有许多可交付成果
  • 项目有许多部署记录(此模型的两个属性是“名称”和“描述”)

我有兴趣从可交付成果索引操作中提取部署记录关联。

我让它与以下代码一起工作,但我觉得它有点难看:

@array = deliverable.try(:project).try(:deployment_record)
if @array
   @array.each do |r|
   [r.name, r.description].join(' - ')
end

重写这个更优雅的方式是什么?我试过

deliverable.try(:project).try(:deployment_record).each do |r|
   [r.name, r.description].join(' - ')
end

但我一直遇到 nil:NilClass错误的未定义方法“每个” 。我似乎无法找到一种方法来优雅地绕过在 Nil 对象上调用的 .each 。我有一种感觉,不知怎的,我应该能够更优雅地做到这一点,但我不能把手指放在上面。

我在代码库中多次重复使用这个片段,所以如果我只是将它复制并粘贴到任何地方,那额外的两行真的会害死我。我很高兴关联检索失败,我只想优雅地失败,没有任何错误或消息。有任何想法吗?

4

2 回答 2

14

您可以使用该to_a方法来确保您有一个可以使用的数组(nil将产生一个空数组):

@array.to_a.each do |item|
    #Whatever...
end

to_a这不是最优雅的事情——您必须记住@array

于 2012-09-18T17:53:20.537 回答
2

在交付中,has_many :deployment_records, through: :project然后当您要求部署记录时,它们将作为空集合返回。

于 2012-09-10T05:19:48.613 回答