2012-02-17 13 views
6

Próbowałem wiele rzeczy, aby nadpisać zachowanie metody: destroy, ale nic nie działa. Użyłem najpierw wtyczki acts_as_paranoia, ale nie działa z modelem w asocjacji has_many: through.Szyny: jak zastąpić: zniszczyć metodę?

chcę nadpisać: zniszczyć metody prostu zrobić coś takiego:

def destroy 
    _run_destroy_callbacks { delete } 
    end 

    def delete  
    self.update_attribute(:status => 0) 
    freeze 
    end 

Oznacza to, że po prostu chcesz zaktualizować kolejne pole (stan na 0) zamiast niszczyć samego rekordu.

Odpowiedz

5

Czy próbowałeś ?:

class MyClass < ActiveRecord::Base 
    def destroy 
    update_attribute(:status, 0) 
    end 
end 

EDIT: Na podstawie uwag, że może być coś innego w pracy, a to może być tylko (: dependent => „”) oznaczenie sprawie definicji Stowarzyszenia - lub jeśli jest to HABTM, może nie działać w ogóle. Może pomoże this info on delete and destroy through associations? Wklejono odpowiednią sekcję poniżej:

Usunąć lub zniszczyć?

has_many and has_and_belongs_to_many association mają metody niszczenia, usuwania, destroy_all i delete_all.

Dla has_and_belongs_to_many, usuwanie i niszczenie są takie same: one powodują usunięcie rekordów w tabeli łączenia.

W przypadku has_many, destroy będzie zawsze wywoływał metodę destroy z usuniętych rekordów , aby wywoływać wywołania zwrotne. Jednak usunie się albo usuń zgodnie ze strategią określoną przez opcję zależną : lub jeśli nie zostanie podana żadna opcja zależna, wtedy będzie postępować zgodnie ze strategią domyślną. Strategia domyślna to: nullify (ustaw klucze obce na zero), z wyjątkiem has_many: through, gdzie domyślną strategią jest delete_all (usuń rekordy złączenia, bez uruchamiania ich oddzwonień).

+0

Tak, to była pierwsza rzecz, którą próbowałem. To nic nie robi. Widzę żądanie DELETE FROM w moich dziennikach. Metoda niestandardowego niszczenia wydaje się nie być wywoływana. –

+0

Hmm, używam tego w kilku modelach w kilku aplikacjach i działa bez problemów. Czy jest coś "specjalnego" w tym konkretnym modelu i czy dzwonisz usunąć lub zniszczyć? Będziesz chciał tego drugiego. – miked

+0

Rekord jest niszczony od rodzica w relacji AREL (ActiveRecord), może to jest problem?W rzeczywistości aktualizuję mój model wina i zapisuję (główny formularz, metoda aktualizacji w kontrolerze), a jeśli zdecyduję się usunąć dziecko (model odmiany zawierający niestandardowe zniszczenie), nie jest to nazywane pozornie. Może mechanizm szyn jest inny do zniszczenia, jeśli to rodzic, który zniszczy dziecko (nie nazywa się zniszczeniem w modelu potomnym?) –

0

Jak powiedział miked, kod ten był dobry, jeśli chcemy zniszczyć odmianową "ręcznie":

@varietal = Varietal.find('1')  
@varietal.destroy 

def destroy 
    update_attribute(:status, 0) 
end 

Działa to doskonale. Jednak, jak już powiedziałem, jeśli zaktualizujemy rekord rodzica, nie znalazłem metody destroy/delete/delete_all wywoływanej na dziecku ... Więc jeśli ktoś ma pomysł ...

2

Myślę, że najlepiej sposobem, aby to zrobić, to zastąpić filtr before_destroy: manipulować utrzymaniu:

def Model 
    before_destroy: mark_as_deleted 

    def mark_as_deleted 
     self.update_attribute(:status => 0) 
    end 
end 

nie byłoby anulować destroy chociaż.

The full callback documentation is here.

+0

To nadal wywołuje destroy() w kontrolerze, po prostu przebiega przez twoją def. Zwracanie wartości false nie działa, przynajmniej nie to, co mogłem powiedzieć. –

Powiązane problemy