2012-04-28 21 views
3

この問題について話題を見つけることができなかったので、これまで気づいたことがあるかどうかはわかりません。しかし、Productモデルと、has_many :productsを設定するCartモデルがあると仮定します。 Productモデルbelongs_to :cartを設定すると、製品インスタンスのcart_id(関連付けられたカートのIDを参照する外部キー)をnilに設定すると、奇妙なことが起こります。三つのことが起こることができます。Rails has_many relationship is weird

  1. あなたはすでにあなたがそのインスタンスメソッドdestroy()も同様破壊されます関連する製品を使用して、そのカートのインスタンスを破棄する際、関連する製品のcart_idnilに設定する前に、関連したカートを取得した場合。

  2. あなたはそのインスタンスメソッドdestroyを破壊し得ない関連する製品を使用してそれを破壊する際、関連する製品のcart_idnilに設定した後に関連したカートを取得した場合。

  3. あなたが関連する製品のcart_idを無効にして(Cart.destroy(cart_id))カートにクラスメソッドdestroyを呼び出すと、関連する製品

を破壊し得ない私は、これはSTHを持っているかなり確信していますhas_manyの実装と関係があります。おそらく、リレーションシップの状態は、取得したモデルインスタンスに固定されていると考えられます。 以下のコードを参照してください:

ここで私は(すでに2上記モデルのテーブルを持っていると仮定した場合)上記をテストするために使用するサンプルコードはありますが

Cart.create # Assume this one has an id of 1 
Product.create(cart_id: 1) 
cart=Cart.find(1) # Retrieve the cart before 
Product.find(1).update_attribute!(cart_id: nil) 
cart.destroy 
Product.find_by_id(1) # nil; the associated product was destroyed 

Cart.create # Assume this one has an id of 1 
Product.create(cart_id: 1) 
Product.find(1).update_attribute!(cart_id: nil) 
cart=Cart.find(1) # Retrieve the cart AFTER 
cart.destroy 
Product.find_by_id(1) # [<Product id:1 cart_id:1 ....>], the assoc product WAS NOT destroyed 

Cart.create # Assume this one has an id of 1 
Product.create(cart_id: 1) 
Product.find(1).update_attribute!(cart_id: nil) 
Cart.destroy(1) 
Product.find_by_id(1) # [<Product id:1 cart_id:1 ....>], the assoc product WAS NOT destroyed 

答えて

0

私は "奇妙な動作"の原因は、データベースオブジェクトをダウンロードすることによって依存関係。どうやら、データベースの依存関係が存在しないにもかかわらず、所有者を削除する廉価版では、従属要素(および既に存在しない要素)が削除されます。

したがって、エントリを再ダウンロードしても、関連付けは破棄されません。

エールの問題、którypokazałeśjest warty odnotowania i sam pewnie bymwpadłw jegopułapkę。

+0

私はあまりにも記事で言った。私はカーテンの後ろに何が起こっているのかもっと知ることが大好きですが、私はソースコードを読むのに十分だとは思いません。 –

+0

申し訳ありませんが、私は少しバズ。土曜日、Uは知っている;) – Eraden

+0

これは、キャッシングを制御するのに似ている可能性があります。何とかカートを取得すると、関連付けられたProductオブジェクトが取得されキャッシュされます(または何らかの形で「記録」されます)。 Cart#productsを呼び出すと、単にキャッシュから取得されます。 –