#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 выше.