이 문제에 대한 주제를 찾을 수 없기 때문에 이전에 누군가가이를 알아 챘는지 확실하지 않습니다. 그러나 제품 모델과 has_many :products
을 설정하는 장바구니 모델이 있다고 가정하십시오. 제품 모델 집합이 belongs_to :cart
인 경우 제품 인스턴스의 cart_id
(연결된 카트의 ID를 참조하는 외래 키)을 nil
으로 설정하면 이상한 일이 발생합니다. 세 가지 문제가 발생할 수 있습니다 :레일 has_many 관계가 이상합니다
당신은 이미 당신은 그것의 인스턴스 메소드
destroy()
, 이뿐만 아니라 파괴됩니다 관련 제품을 사용하여 해당 카트 인스턴스를 파괴 할 때, 관련 제품의cart_id
nil
에 설정하기 전에 관련된 카트를 검색합니다.당신은 당신의 인스턴스 메소드
destroy
, 이 파괴되지 않습니다 관련 제품을 사용하여 파괴 할 때, 관련 제품의cart_id
nil
에 설정 한 후 관련된 카트를 검색합니다. 당신이 관련 제품의cart_id
을 무효화하고 카트 (Cart.destroy(cart_id)
)에 클래스 메소드destroy
를 호출 할 경우가, 관련 제품 이
파괴되지 않습니다 나는이 STH을 가지고 확실 해요 has_many
의 구현과 관련이 있습니다. 아마 당신이 그것을 검색 할 때 관계의 상태가 모델 인스턴스에 연결된 것입니다. 아래의 코드를 참조하십시오 : 여기
내가 위를 테스트하는 데 사용되는 샘플 코드의
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
(이미를 2 위에 언급 한 모델 테이블을 한 가정)
내가 게시물에서도 그렇게 말했어. 커튼 뒤에서 무슨 일이 벌어지고 있는지 더 자세히 알기를 바랍니다. 그러나 나는 소스 코드를 읽을만큼 충분히 좋다고 생각하지 않습니다. –
죄송합니다. 조금 윙윙 거리고 있습니다. 토요일, U 알아;) – Eraden
이것은 제어 캐싱과 비슷하기 때문일 수 있습니다. 어떻게 든 카트를 검색하면 관련 Product 객체가 검색되고 캐시 (또는 어떻게 든 "기록")되고 다음 번에 Cart # products를 호출하면 캐시에서 간단히 검색됩니다. –