2012-01-03 8 views
0

私はRails 3.1.3とRuby 1.9.2を使用しています。データベースにシードデータを作成するときにバグのように思えます。私はシンプルなワインコレクションアプリを作っています。ちょうど2つのシンプルなインスタンス(nameは "赤"または "白")を持つGrapeクラスを持っています。私はbelongs_toGrapeクラスの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フィールド値を自動的に検索すると考えました。

+0

あなたが明示的に動的ファインダーby_grape_idを使用すると、あなたがIDを渡すことが予想されます。 – Johny

+0

それが本当であれば、なぜ白いGrapeインスタンスでfind_by_grape_idがうまくいくのですか?また、find_or_createのために実行されたSQLは、最初に白いGrapeインスタンスのIDを持つ正しいSELECTを実行しますが、Varietalを作成するINSERTには間違ったIDが付いています。まだ私のバグのようです。 –

答えて

0

IDの代わりにオブジェクトを渡すことはできますが、ルーティングや関連付けの方が多い傾向があります。

あなたはgrape_idで見つけるためにそれを尋ねるが、問題がどこにあるかで名前とブドウインスタンスに渡しています。

IDをファインダに指定する場合は、IDを渡す必要があります。

0

rwは、Grapeのオブジェクトを返す必要があります。だからこのような要素idにアクセスできませんか?

# save grape stuff by entering the ID instead of the object 
# create some reds 
r = Grape.find_or_create_by_name('Red') 
Varietal.find_or_create_by_name_and_grape_id('Cabernet Franc', r.id) 
Varietal.find_or_create_by_name_and_grape_id('Cabernet Sauvignon', r.id) 
Varietal.find_or_create_by_name_and_grape_id('Malbec', r.id) 

# create some whites 
w = Grape.find_or_create_by_name('White') 
Varietal.find_or_create_by_name_and_grape_id('Chardonnay', w.id) 
Varietal.find_or_create_by_name_and_grape_id('Riesling', w.id) 
Varietal.find_or_create_by_name_and_grape_id('Sauvignon Blanc', w.id) 

これは、選択したブドウのIDを渡し、使用しているダイナミックファインダーと一致します。

関連する問題