【问题标题】:Technique for dealing with nils in a deeply nested object model在深度嵌套的对象模型中处理 nil 的技术
【发布时间】:2011-08-13 16:28:56
【问题描述】:

我正在开发一个具有深度嵌套关联的旧版 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 )。

【问题讨论】:

  • .reject 可能会过滤掉 nil 值?
  • 哪一步引入了 nil 对象?
  • 根据我选择的 model_a 更改步骤。有时它是一个model_b 对象,它在数组中出现为零,其他时候它是model_c 或model_d。如下所述,在每种情况下,我都会在调用 map 之前尝试运行 compact 以防止出现 nil。

标签: ruby-on-rails ruby


【解决方案1】:

使用Array#compact:

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

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

【讨论】:

  • 是的,我将在每次调用关联之前运行它。如果您有任何其他建议,请告诉我。
【解决方案2】:

你有任何 has_may :through 关联吗?喜欢

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 和 C 的成员了解很多。但这至少将其抽象出来,现在您可以调用:

model_a.model_ds.map(&:display_field)

【讨论】:

    猜你喜欢
    • 2011-02-02
    • 2021-09-03
    • 1970-01-01
    • 2020-02-15
    • 2010-10-11
    • 2014-06-10
    • 2018-11-30
    • 1970-01-01
    • 2017-04-04
    相关资源
    最近更新 更多