Rails: зависит => уничтожить, хочу вызвать другое действие, а не уничтожить
-
27-10-2019 - |
Вопрос
У меня есть has_many: через модель, которая работает отлично.
has_many :varietals
has_many :grapes, :through => :varietals, :dependent => :destroy
Я хотел бы назвать еще одно действие вместо: уничтожить. На самом деле, я не хочу аннулировать элемент или уничтожать его, я хочу обновить поле состояния записи с 1 до 0 вместо того, чтобы уничтожить запись.
Как вызвать пользовательский метод вместо уничтожения? Я полагаю, я могу сделать это в самой модели ... спасибо.
Куда поместить этот метод? В главной модели или в модели, где будет уничтожена запись?
РЕДАКТИРОВАТЬ:
Мне жаль, но я думаю, что я недостаточно объяснил свою проблему. Моя проблема заключается не только в том, чтобы что -то после того, как главная модель уничтожена. Я хочу настраивать действие уничтожения в самой варианте сорта, даже если мастер -запись не уничтожена.
Что-то типа:
class Varietal < ActiveRecord::Base
private
def destroy
self.update_attributes(:status => 0)
end
end
На самом деле это действие не называется ...
Решение
has_many: иждивенье ограничено лишь несколькими вариантами. Согласно документация:
: Зависит, если установить: уничтожить все связанные объекты, уничтожаются вместе с этим объектом, называя их метод уничтожения. Если установить на: delete_all, все связанные объекты удаляются, не вызывая их метод уничтожения. Если установлено: Нависнуть за иностранные ключи всех связанных объектов, установлены на NULL, не вызывая их сохранения обратных вызовов. Если установить: ограничить этот объект поднимает исключение Activerecord :: DeleterStrictionError и не может быть удален, если у него есть какие -либо связанные объекты.
При использовании с помощью: через опцию ассоциация на модели соединения должна быть принадлежностью, а записи, которые удаляются, - это записи соединения, а не связанные записи.
Похоже, вам нужно изменить метод уничтожения, чтобы обновить поле состояния.
Другие советы
Вы можете использовать перед_дестрой, чтобы поместить там свою пользовательскую логику. Например,
before_destroy :reset_status
def reset_status
...
end
Проверять здесь Больше подробностей.
Вам просто нужно добавить обратный вызов на hone_destroy или After_destroy и манипулировать своими ассоциациями. По примеру
after_destroy :do_on_grapes
def do_on_grapes
grapes.map(&:to_do)
end
Я считаю, что хороший подход к решению вашей проблемы - предоставить пользовательский метод уничтожения. Есть несколько ответов на подобные вопросы, но вы должны помнить, что Activerecord и такие отношения, как:
class Image < ActiveRecord::Base
has_many :comments, dependent: :destroy
Используйте механизмы обратного вызова, которые также вызывают уничтожение цепочки к вашим отношениям. Обычно вы должны сохранить этот механизм и добавить его в свою пользовательскую реализацию. Например
def destroy
self.update deleted_at: Time.now
run_callbacks :destroy
end
Вы тоже можете прочитать этот пост:Запуск зависимости :: уничтожение с помощью переопределенного метода уничтожения