2012-04-28 2 views
3

이 문제에 대한 주제를 찾을 수 없기 때문에 이전에 누군가가이를 알아 챘는지 확실하지 않습니다. 그러나 제품 모델과 has_many :products을 설정하는 장바구니 모델이 있다고 가정하십시오. 제품 모델 집합이 belongs_to :cart 인 경우 제품 인스턴스의 cart_id (연결된 카트의 ID를 참조하는 외래 키)을 nil으로 설정하면 이상한 일이 발생합니다. 세 가지 문제가 발생할 수 있습니다 :레일 has_many 관계가 이상합니다

  1. 당신은 이미 당신은 그것의 인스턴스 메소드 destroy(), 이뿐만 아니라 파괴됩니다 관련 제품을 사용하여 해당 카트 인스턴스를 파괴 할 때, 관련 제품의 cart_idnil에 설정하기 전에 관련된 카트를 검색합니다.

  2. 당신은 당신의 인스턴스 메소드 destroy, 파괴되지 않습니다 관련 제품을 사용하여 파괴 할 때, 관련 제품의 cart_idnil에 설정 한 후 관련된 카트를 검색합니다. 당신이 관련 제품의 cart_id을 무효화하고 카트 (Cart.destroy(cart_id))에 클래스 메소드 destroy를 호출 할 경우

  3. 가, 관련 제품

파괴되지 않습니다 나는이 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 위에 언급 한 모델 테이블을 한 가정)

답변

0

"이상한 동작"의 원인은 데이터베이스 개체를 다운로드하면 해당 개체가 의존성. 데이터베이스 종속성이 존재하지 않더라도 소유자를 제거하는 할인은 종속 요소 (및 이미 존재하지 않는 요소)를 제거합니다.

따라서 항목을 다시 다운로드해도 연결이 파괴되지 않습니다.

에일 문제는 다음과 같이 나타납니다.

+0

내가 게시물에서도 그렇게 말했어. 커튼 뒤에서 무슨 일이 벌어지고 있는지 더 자세히 알기를 바랍니다. 그러나 나는 소스 코드를 읽을만큼 충분히 좋다고 생각하지 않습니다. –

+0

죄송합니다. 조금 윙윙 거리고 있습니다. 토요일, U 알아;) – Eraden

+0

이것은 제어 캐싱과 비슷하기 때문일 수 있습니다. 어떻게 든 카트를 검색하면 관련 Product 객체가 검색되고 캐시 (또는 어떻게 든 "기록")되고 다음 번에 Cart # products를 호출하면 캐시에서 간단히 검색됩니다. –