1

私のレールアプリには、理解しようとしているシードがいくつかあります。問題のコードから始めます。


make = Make.where(value: 'Alfa Romeo').first_or_create
model = make.models.where(value: '147').first_or_create
trim = model.trims.where(value: '1.6 TS 3d (2001 - 2005)').first_or_create
values = [
 {value: '2001 (X)'},
 {value: '2001 (Y)'},
 {value: '2001 (51)'},
 {value: '2002 (51)'},
 {value: '2002 (02)'},
 {value: '2002 (52)'},
 {value: '2003 (52)'},
 {value: '2003 (03)'},
 {value: '2003 (53)'},
 {value: '2004 (53)'},
 {value: '2004 (04)'},
 {value: '2004 (54)'},
 {value: '2005 (54)'},
 {value: '2005 (05)'}
]
values.each do |item|
  trim.model_years.where(item).first_or_create
end

このコードに期待しているのは、製造元、モデル、およびトリムを作成または特定し、適切なモデル年をトリムに関連付けることです。

ただし、何が起こっているかというと、重複したモデル年が作成されているということです。たとえば、トリムを「2001 (X)」に関連付ける代わりに、値「2001 (X)」で新しいレコードを作成しています。明確にするために、first_or_create ではなく create を使用しているかのように動作しています。

なぜこれが起こっているのか、それを修正するのを手伝ってくれる人はいますか?

編集:混乱を避けるために、最初の回答で参照されているfind_or_create_byの問題なしで、現在のコードを反映するように上記のコードを調整しました。上記のコードはまだ重複を作成しています。

編集 2: コードで根本的に間違っている可能性があることがわかりました。私がやろうとしているのは、トリムと model_year の間に関連付けを作成することです (これは多対多の関係として設定されます)。 . そのため、実際には既存のレコードを見つけて関連付けを追加したいだけなのに、レコードを作成していることが間違っている可能性があります。

そのため、first_or_create ではなく、新しいオブジェクトを作成せずに関連付けを宣言するステートメントを使用する必要があります。

したがって、私は自分の声明を次のように修正しました。これは機能しています。

trim.model_years << ModelYear.where(item).first_or_create

ご協力ありがとうございます。

4

1 に答える 1

3

ここにいくつかの修正:

make = Make.find_or_create_by_value('Alfa Romeo')
model = make.models.find_or_create_by_value('147')
trim = model.trims.find_or_create_by_value('2.0 Lusso 5d (2001 - 2005)')
values = [
 {value: '2001 (X)'},
 {value: '2001 (Y)'},
 {value: '2001 (51)'},
 {value: '2002 (51)'},
 {value: '2002 (02)'},
 {value: '2002 (52)'},
 {value: '2003 (52)'},
 {value: '2003 (03)'},
 {value: '2003 (53)'},
 {value: '2004 (53)'},
 {value: '2004 (04)'},
 {value: '2004 (54)'},
 {value: '2005 (54)'},
 {value: '2005 (05)'}
]
values.each do |item|
  trim.model_years.where(item).first_or_create
end

を使用する場合_by_value、ActiveRecord は ... 値を期待します! ハッシュではありません:)

于 2012-07-31T19:21:40.447 に答える