如何使从属记录处于非活动状态但不使用关注销毁

时间:2019-04-09 07:44:15

标签: ruby-on-rails-5 ruby-on-rails-5.1 ruby-on-rails-5.2

我有一个名为runningmenu的模型,我想在销毁时将其停用,而不是硬删除,并且我想使其所有相关记录(例如订单)都停用

我正在使用ruby 2.4.0和rails 5,我尝试使用活动记录关注点,销毁前我正在调用关注点销毁销毁方法来翻转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

我拥有的ON订单模型:

before_destroy -> { stop_destroy_for_orders }

关于运行菜单模型,我有:

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

预期结果是使所有与运行菜单相关的子级在删除时不活动,而不是硬删除。但是现在只有第一个实例状态设置为已取消并回滚。

1 个答案:

答案 0 :(得分:0)

我不知道您是否对使用宝石感到满意,但是比较流行的一种是偏执狂:

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时,该记录将不会被删除,但是会在“删除”时间更新其delete_at列。这将为订单添加一个默认范围,这意味着如果您进行Order.all,它将仅返回具有niled_at的订单。上面的github中提供了更多有关如何真正删除记录并将其包括在范围内的更多命令。