私はRails 3.1.3とRuby 1.9.2を使用しています。データベースにシードデータを作成するときにバグのように思えます。私はシンプルなワインコレクションアプリを作っています。ちょうど2つのシンプルなインスタンス(name
は "赤"または "白")を持つGrape
クラスを持っています。私はbelongs_to
Grape
クラスのVarietal
クラスを持っていて、単純なname
フィールドも持っています。Rails 3.1でIDの代わりにオブジェクトを使用するcreate call
私はいくつかのシード・データを作成するために行くとき、私は次のようなコードを使用します。
不思議# create some reds
r = Grape.find_or_create_by_name('Red')
Varietal.find_or_create_by_name_and_grape_id('Cabernet Franc', r)
Varietal.find_or_create_by_name_and_grape_id('Cabernet Sauvignon', r)
Varietal.find_or_create_by_name_and_grape_id('Malbec', r)
# create some whites
w = Grape.find_or_create_by_name('White')
Varietal.find_or_create_by_name_and_grape_id('Chardonnay', w)
Varietal.find_or_create_by_name_and_grape_id('Riesling', w)
Varietal.find_or_create_by_name_and_grape_id('Sauvignon Blanc', w)
、私は、データベース内のデータを見て行くと、Varietals
の全てが関連付けられています"赤" Grape
。 Railsコンソールを使用して、id
フィールドをインスタンスGrape
インスタンスからではなくインスタンスに渡すと、正しい動作が得られることがわかりました。
何か不足していますか? Railsでは、生IDの代わりに常にActiveRecordオブジェクトを渡すことができ、id
フィールド値を自動的に検索すると考えました。
あなたが明示的に動的ファインダーby_grape_idを使用すると、あなたがIDを渡すことが予想されます。 – Johny
それが本当であれば、なぜ白いGrapeインスタンスでfind_by_grape_idがうまくいくのですか?また、find_or_createのために実行されたSQLは、最初に白いGrapeインスタンスのIDを持つ正しいSELECTを実行しますが、Varietalを作成するINSERTには間違ったIDが付いています。まだ私のバグのようです。 –