1

現在、データベースをシードしていますが、以下のセクションで予期しない結果が得られています。


trim.model_years.find_or_create_by_value([
 {value: '2009 (58)'},
 {value: '2009 (09)'},
 {value: '2009 (59)'},
 {value: '2010 (59)'},
 {value: '2010 (10)'},
 {value: '2010 (60)'},
 {value: '2011 (60)'},
 {value: '2011 (11)'},
 {value: '2011 (61)'},
])

私はこれがこれらのそれぞれを個別に扱い、レコードに対して find_or_create を実行することを期待していました (9 つの個別のレコードを作成する通常の作成メソッドからフォーマットを適応させました)。

しかし、起こっているように見えるのは、「value:」などを含むすべてのレコードを含む文字列である 1 つのレコードを取得していることです。

これをフォーマットして、9 つの個別のレコードを find_or_created できるようにするにはどうすればよいですか?

編集: 配列の反復処理に関する回答に感謝します。各ループ。変更したコードを以下に含めました。


make = Make.find_or_create_by_value(value: 'Alfa Romeo')
model = make.models.find_or_create_by_value(value: '147')
trim = model.trims.find_or_create_by_value(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

もちろん、このような多くのブロックがあり、それらはすべて同じ年式のモデルを再利用する必要がありますが、代わりに first_or_create が常に重複を作成しているようです。

4

1 に答える 1

2

配列を反復処理することにより:

values = [
  {value: '2009 (58)'},
  {value: '2009 (09)'},
  {value: '2009 (59)'},
  {value: '2010 (59)'},
  {value: '2010 (10)'},
  {value: '2010 (60)'},
  {value: '2011 (60)'},
  {value: '2011 (11)'},
  {value: '2011 (61)'},
]

values.each do |item|
  trim.model_years.find_or_create_by_value(item[:value])
end

ちなみに、Rails Guidesfirst_or_createでは代わりに を使用することを推奨していfind_or_create_byます。first_or_createコードは次のようになります。

values.each do |item|
  trim.model_years.where(item).first_or_create
end

申し訳ありませんが、あなたの新しい質問がわかりません。これにより、重複するレコードが作成されません。各モデルのモデル年を作成する必要があります。このようなもの:

id | model_id | value
=========================
 1 |        1 | 2001 (X)
 2 |        1 | 2001 (Y)
 3 |        1 | 2001 (51)
 4 |        1 | 2002 (51)
 5 |        1 | 2002 (52)
 6 |        2 | 2001 (X)
 7 |        2 | 2001 (Y)
 8 |        2 | 2001 (51)

したがって、はい、重複する値がありますが、すべての行は一意になります。これが望ましくない場合は、データベースを再構築する必要があります。

于 2012-07-31T15:53:12.593 に答える