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 に答える