この問題について話題を見つけることができなかったので、これまで気づいたことがあるかどうかはわかりません。しかし、Productモデルと、has_many :products
を設定するCartモデルがあると仮定します。 Productモデルbelongs_to :cart
を設定すると、製品インスタンスのcart_id
(関連付けられたカートのIDを参照する外部キー)をnil
に設定すると、奇妙なことが起こります。三つのことが起こることができます。Rails has_many relationship is weird
あなたはすでにあなたがそのインスタンスメソッド
destroy()
、も同様破壊されます関連する製品を使用して、そのカートのインスタンスを破棄する際、関連する製品のcart_id
nil
に設定する前に、関連したカートを取得した場合。あなたはそのインスタンスメソッド
destroy
、はを破壊し得ない関連する製品を使用してそれを破壊する際、関連する製品のcart_id
nil
に設定した後に関連したカートを取得した場合。あなたが関連する製品の
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
私はあまりにも記事で言った。私はカーテンの後ろに何が起こっているのかもっと知ることが大好きですが、私はソースコードを読むのに十分だとは思いません。 –
申し訳ありませんが、私は少しバズ。土曜日、Uは知っている;) – Eraden
これは、キャッシングを制御するのに似ている可能性があります。何とかカートを取得すると、関連付けられたProductオブジェクトが取得されキャッシュされます(または何らかの形で「記録」されます)。 Cart#productsを呼び出すと、単にキャッシュから取得されます。 –