1

我正在遍历 Rails 模型的一组实例。这是我的代码:

product_details.each do |product_detail|
  product_detail.label = Backend::ProductGroup.where(product_group_number: product_detail.product_group).first.label

end

'product_detail' 中的属性 'label' 不是我的 Rails ActiveRecord 模型中的属性。我在我的类定义中用 attr_accessor 添加了它。我这样做是因为我想动态添加这个属性,只有当我需要这样做的时候。当我在 Rails 控制台中运行没有“每次”迭代的代码时,它工作得很好。但是当我执行上面的代码时,我收到以下错误消息:

NoMethodError:nil 的未定义方法“标签”:NilClass

我做了什么明显错误的事情吗?提前谢谢了。

4

1 回答 1

1

您可能有几个product_detail不匹配的项目product_group。所以调用.first空集合返回nil。要解决该错误,您可以在继续之前测试是否找到了 product_group:

product_details.each do |product_detail|
  product_group = Backend::ProductGroup.where(product_group_number: product_detail.product_group).first
  product_detail.label = product_group.label if product_group
end

您也可以像这样更有效地执行此操作:

group_labels = BackEnd::ProductGroup.
                 where(product_group_number: product_details.map(&:product_group)).
                 inject({}){|m, g| m[g.product_group_number] = g.label; m}
product_details.each do |product_detail|
  product_detail.label = group_labels[product_detail.product_group]
end

这将导致一个单一的数据库调用来获取所有相关组,并将标签放在一个键控散列中,以便于发现和分配。

于 2013-04-10T16:47:50.553 回答