Как сделать зависимые записи неактивными, но не уничтожать с помощью concern

#ruby-on-rails-5 #ruby-on-rails-5.1 #ruby-on-rails-5.2

#ruby-on-rails-5 #ruby-on-rails-5.1 #ruby-on-rails-5.2

Вопрос:

У меня есть модель с именем runningmenu, я хочу отключить ее при уничтожении, но не при жестком удалении, а также я хочу отключить все ее зависимые записи, например, заказы

я использую ruby 2.4.0 и rails 5. я пытался использовать проблемы с активными записями, перед уничтожением я вызываю метод concern stop destroy, чтобы перевернуть delete_status и прервать выполнение. когда я прерываю работу с зависимыми записями, он отправляет исключение «не удалось уничтожить» в действие уничтожения runningmenu. Но он просто прерывается при первой записи и не делает все зависимые записи неактивными.

 module Deletable
  extend ActiveSupport::Concern
  def stop_destroy
    self.deleted!
    throw(:abort)
  end

  def stop_destroy_for_orders
    self.update_column(:status, Order.statuses[:cancelled])
    throw(:abort)
  end
end
  

В модели Orders у меня есть:

 before_destroy -> { stop_destroy_for_orders }
  

в модели runningmenu у меня есть:

 has_many :orders, dependent: :destroy
before_destroy -> { stop_destroy }
  

ожидаемый результат — сделать все дочерние элементы, зависящие от runningmenu, неактивными при удалении, но не при жестком удалении. Но теперь только для статуса первого экземпляра установлено значение отменено и откат.

Ответ №1:

Я не знаю, довольны ли вы использованием gems или нет, но одним из наиболее популярных является paranoia:

https://github.com/rubysherpas/paranoia

 bin/rails generate migration AddDeletedAtToOrders deleted_at:datetime:index
  

Добавьте столбец deleted_at в свои заказы, затем запустите rake db:migrate , чтобы добавить столбец в свою базу данных. В вашей модели заказов:

 class Order < ActiveRecord::Base
  acts_as_paranoid

  # ...
end
  

Теперь, когда вы вызываете Order.destroy , запись не будет удалена, но ее столбец deleted_at будет обновляться со временем «удаления». Это добавит область действия по умолчанию для заказов, то есть, если вы это сделаете Order.all , он будет возвращать только заказы с нулевым значением deleted_at . Дополнительные команды для того, как действительно удалить запись и включить ее в области видимости, включены в их github выше.