3

これをもっとよく説明したいのですが、私が知っている最善の方法です。車と色の2つのクラスがあります。それぞれは、関連付けクラスCarColorsを介して相互に多くを持つことができます。アソシエーションは正しく設定されています。私はこれに肯定的ですが、これを機能させることができないようです。

@carlist = Cars.includes(:Colors).all

@carlist.colors

エラー

@carlist[0].colors

WORKS

私の質問は、成功した例のようにインデックスを宣言せずに@carlistを反復処理するにはどうすればよいですか?以下は私が試したいくつかのことですが、これも失敗します。

@carlist.each do |c|
c.colors
end

@carlist.each_with_index do |c,i|
c[i].colors
end
4

1 に答える 1

1

最初の例Car.includes(:colors).allは、単一の車ではなく車の配列を返すため失敗します。したがって#colors、配列に定義されていないため、次の例は失敗します。

@cars = Car.includes(:colors).all
@cars.colors #=> NoMethodError, color is not defined for Array

イテレータには車のインスタンスがあるため、次のように機能します

@cars.each do |car|
  puts car.colors # => Will print an array of color objects
end

each_with_index同様に機能しますが、最初のオブジェクトは各ループカーオブジェクトと同じであり、2番目のオブジェクトはインデックスであるため、少し異なります。

@cars.each_with_index do |car, index|
  puts car.colors # => Will print an array of color objects
  puts @cars[index].colors # => Will print an array of color objects
  puts car == @cars[index] # => will print true
end
于 2012-08-14T14:47:59.823 に答える