2009-09-09 7 views
47

Podlegle zależne => niszczenie jest ignorowane, gdy używasz również opcji: through.zależna => niszcz na skojarzeniu "has_many through"

Więc mam to ...

class Comment < ActiveRecord::Base 
    has_many :comment_users, :dependent => :destroy 
    has_many :users, :through => :comment_users 
    ... 
end 

... ale usuwając komentarz nie powoduje powiązanych rekordów comment_user uzyskiwanie usunięte.

Jakie jest zalecane podejście w przypadku kaskadowego usuwania przy użyciu: do?

Dzięki

Odpowiedz

96

Podobno zależny nie jest ignorowany!

Prawdziwym problemem było to, że dzwoniłem pod numer Comment.delete(id), który przechodzi bezpośrednio do db, podczas gdy ja teraz używam Comment.destroy(id), który ładuje obiekt Comment i wywołuje destroy() na nim. To podnosi :dependent => :destroy i wszystko jest dobrze.

+0

rzeczywiście! Miałem podobny problem, z wyjątkiem tego, że otrzymywałem błędy klucza obcego, mimo że używałem 'dependent:: destroy'. Problem polegał na tym, że używałam 'obiektu obj.delete' zamiast' obj.destroy', więc osoby zależne nie zostały usunięte, a zatem błąd integralności. –

11

Oryginalne rozwiązanie plakatu jest ważne, jednak chciałem podkreślić, że działa to tylko wtedy, gdy masz kolumnę identyfikatora dla tego stołu. Wolę, aby moje tabele "wiele do wielu" były tylko dwoma obcymi kluczami, ale musiałem usunąć mój "id: false" z tabeli migracji, aby kaskadowe usuwanie działało. Posiadanie tej funkcji zdecydowanie przewyższa brak kolumny id w tabeli.

+0

Dziękujemy! Po prostu spędziłem pół dnia próbując to samemu zrozumieć. – Tintin81

+2

Ci da prawdziwy mvp – jed

5

Jeśli masz polimorficzny stowarzyszenie, należy zrobić co @blogofsongs powiedział, ale z atrybutem foreign_key tak:

class User < ActiveRecord::Base 
    has_many :activities , dependent: :destroy, foreign_key: :trackable_id 
end 
Powiązane problemy