Rails: зависит => уничтожить, хочу вызвать другое действие, а не уничтожить

StackOverflow https://stackoverflow.com/questions/9326706

  •  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

Вы тоже можете прочитать этот пост:Запуск зависимости :: уничтожение с помощью переопределенного метода уничтожения

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top