在深度嵌套的对象模型中处理nils的技术

时间:2011-08-13 16:28:56

标签: ruby-on-rails ruby

我正在研究具有深层嵌套关联的传统rails应用程序。我有一些要求,要求将一些深层嵌套的属性冒泡并显示出来。

目前我正在做这样的事情来显示结果(使用ActiveRecord关联和数组)

model_a
  .collection_of_model_b
  .map(&:collection_model_c)
  .flatten
  .map(&:collection_model_d)
  .display_field

这种方法适用于测试数据但是一旦我开始使用真实数据,我就开始注意到NilClass错误。

请提供有关我可用于获取此数据的技术,语法和模式的指导。

我已经考虑但尚未追求的一些方法: 1)在每次进入关卡时,在单独的行中分解呼叫,检查nils。 2)使用直接sql(find_by_sql)。

2 个答案:

答案 0 :(得分:2)

使用Array#compact

>> [1, 2, nil, 3].compact
=> [1, 2, 3]

>> [[1, 2], [3, nil], [4]].map(&:compact)
=> [[1, 2], [3], [4]]

答案 1 :(得分:0)

你有任何has_may:通过关联吗?像

class ModelA < ActiveRecord::Base
  ...
  has_many :model_bs
  has_many :model_cs, :through => :model_bs
  has_many :model_ds, :through => :model_cs
  ...
end

就我个人而言,我认为这仍然违反了得墨忒耳法,因为ModelA对模型B和B的成员仍然了解很多。 C.但这至少将它抽象出来,现在你可以打电话:

model_a.model_ds.map(&:display_field)