2012-02-17 4 views
6

Я пробовал много вещей, чтобы переписать поведение метода: destroy, но ничего не работает. Сначала я использовал плагин act_as_paranoia, но он не работает с моделью в has_many: через объединение.Рельсы: как переписать: уничтожить метод?

Я хочу перезаписать: уничтожить метод только, чтобы сделать что-то вроде этого:

def destroy 
    _run_destroy_callbacks { delete } 
    end 

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

То есть, я просто хочу, чтобы обновить еще одно поле (статус 0) вместо того, чтобы разрушить саму запись.

ответ

5

Вы пробовали ?:

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

EDIT: На основе замечаний, может быть что-то еще на работе, и это может быть просто (: зависимый => «») обозначение по определению ассоциации - или если это HABTM, это может вообще не работать. Может быть, this info on delete and destroy through associations поможет? Вставка соответствующей секции ниже:

Удалить или уничтожить?

has_many и has_and_belongs_to_many ассоциации имеют методы уничтожить, удалить, destroy_all и delete_all.

Для has_and_belongs_to_many, удаление и уничтожение одинаковы: они заставляют записи в таблице соединений удаляться.

Для has_many, destroy всегда будет вызывать метод уничтожения записей (0) , удаляемых, чтобы выполнялись обратные вызовы. Однако delete будет либо выполнить удаление в соответствии со стратегией, заданной опцией : зависимой, либо если нет: зависимая опция, то она будет следовать стратегии по умолчанию. Стратегия по умолчанию: nullify (установить внешние ключи), за исключением has_many: through, где стратегия по умолчанию - delete_all (удалить записи объединения, не выполняя обратные вызовы ).

+0

Да, это было первое, что я пробовал. Это ничего не делает. Я могу увидеть запрос DELETE FROM в моих журналах. Метод пользовательского уничтожения, похоже, не называется. –

+0

Я действительно использую это в нескольких моделях в нескольких приложениях, и он работает безотказно. Есть ли что-то особенное в этой конкретной модели и вы вызываете удаление или уничтожение? Тебе понадобится последний. – miked

+0

Запись уничтожается от ее родителя в AREL (отношение ActiveRecord), может быть, это проблема?Фактически, я обновляю свою модель вина и запись (основная форма, метод обновления в контроллере), и если я хочу удалить дочерний элемент (модель сортов, которая содержит пользовательский уничтожить), она не называется явно. Может быть, механизм рельсов отличается от разрушения, если он родитель, который уничтожает ребенка (не называйте destroy на дочерней модели?) –

0

Как сказал Miked, этот код был хорошим, если мы хотим уничтожить сортовое «вручную»:

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

def destroy 
    update_attribute(:status, 0) 
end 

Это отлично работает. Однако, как я уже сказал, если мы обновим родительскую запись, я не нашел метод destroy/delete/delete_all, который вызывается у ребенка ... Так что если у кого-то есть идея ...

2

Я думаю, что лучший способ сделать это, чтобы перезаписать before_destroy: фильтр манипулировать иждивенцы:

def Model 
    before_destroy: mark_as_deleted 

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

Это не отменит destroy хотя.

The full callback documentation is here.

+0

Это все еще вызывает destroy() в контроллере, оно просто проходит через ваш def first. Возвращение false не работает, по крайней мере, не то, что я мог сказать. –

Смежные вопросы