繁体   English   中英

Rails 3-NoMethodError:每个迭代中nil:NilClass的未定义方法

[英]Rails 3 - NoMethodError: undefined method for nil:NilClass in each Iteration

我正在遍历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”中的“标签”属性不是我的Rails ActiveRecord模型中的属性。 我在类定义中添加了attr_accessor。 我这样做是因为我想仅在需要执行此操作时动态添加此属性。 当我在Rails控制台中运行没有“每个”迭代的代码时,它就可以正常工作。 但是当我执行上面的代码时,我收到以下错误消息:

NoMethodError:nil:NilClass的未定义方法'label'

我做错了什么吗? 提前谢谢了。

您可能有几个没有匹配的product_group product_detail项。 因此,在空集合上调用.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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM