2011-12-06 9 views
1

おそらくこれはRailsが動作する方法ですが、私はそれが初めてであるため再確認したいのですが、何か不足しているかどうかわかりません。belongs_to関係は保存するまで動作しません - 私は間違っていますか?

多くのネストされたhas_many/belongs_to関係を持つかなり複雑なモデルを作成しています。最初は、create()メソッドを使用してみましたが、データベース接続が毎回開始されるため、終了するまでに多くの時間がかかりました。代わりにnew()を使用してすべてのオブジェクトを作成し、< <を使用してネストされたモデルを上位モデルに追加し、最後に最上位モデルでsave()を実行します。

これはすべて動作しますが、私がセーブするまではbelongs_to関係は機能しません。言い換えれば、

class Foo < ActiveRecord::Base 
    has_many :bars 
end 
class Bar < ActiveRecord::Base 
    belongs_to :foo 
end 
f = Foo.new 
b = Bar.new 
f.bars << b 
puts "It's nil!" if b.foo == nil #yup, it's nil 
f.save 
puts "It's good!" if b.foo != nil #yup, it's good 

私は推測します。実際にはにはというIDがあり、それが保存されるまで起こらない限り、Fooを指すようにidフィールドを設定することはできません。それは大したことではない、私は最初に(やや複雑な)初期化を書いた方法、低レベルのモデルの1つが祖父母から何らかの情報を得るために呼び出されていて、それが動作していなかったために気がついた。とにかくそれを取り除いたコードはきれいだったが、私はそれが完全に間違ったやり方でやっているというこのやつな気持ちを助けることはできないし、実際に保存するまでhas_many関係が一時的に壊れてしまう状況はないはずですデータベース。

誰でも私の心を安らかにしたいと思っていますか、それとも私に「正しい」方法を伝えたいですか?

+0

あなただけf.bars.new使用カントを行うことなく、自動的に関係を設定するには

f.bars.new 

を行うことができますか? –

+0

私はf.bars.newが同じ問題を抱えていると信じています。実際のコードでは、Barを構築するために別の関数を呼び出すので、<< collection.newよりも<<を使用する方が理にかなっています。私はこのおもちゃの例に同意する、それはそんなことをするのは馬鹿だ。 – user435779

答えて

1

あなたはこのラインを使用して独自の質問に答え:

をそれは私が推測する意味があります。私が意味する、それはそれはFooが実際にIDを持つまで、フーを指すようにidフィールドを設定することはできません、と私はバーの上の外部キーのオフbelongs_to作品以来

を保存するまで、それは起こりません。 Foo上のIDまで一致する場合、そのIDが存在するまでは関係を持つことはできません。

側の注意点として、あなたはf.bars << b

+0

良い、ありがとう、ちょうど私が悪い習慣または何かを使用していないことを確認したかった。 Barを構築している(XMLを解析する必要がある)別の関数があるため、collection.newの代わりに<<を使用しています – user435779

+0

助けてくれて嬉しいです!これがあなたの質問に答えるなら、質問を閉じるために私の答えの横にあるチェックマークを押してください。 – iwasrobbed

1

これは正しいです。 FooにIDが入力されるまで、FooにはBarが使用されません。

関連する問題