如何使相关记录无效但不会因使用问题而破坏

问题描述 投票:0回答:1

我有一个名为runningmenu的模型,我希望在销毁但不是硬删除时将其处于非活动状态,并且我还想要使其所有相关记录无效,例如订单

我正在使用ruby 2.4.0和rails 5我尝试过使用主动记录问题,在销毁之前我正在调用关注停止销毁方法来翻转delete_status并抛出中止。当我对依赖记录进行中止时,它发送的命令无法销毁runmenu destroy动作的异常。但它只是在第一个记录中中止,并没有使所有相关记录无效。

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 }

在runningmenu模型我有:

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

预期的结果是使所有runningmenu依赖子项在删除时处于非活动状态而不是硬删除。但现在只将第一个实例状态设置为取消并回滚。

ruby-on-rails-5 ruby-on-rails-5.1 ruby-on-rails-5.2
1个回答
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时,该记录将不会被删除,但会将其deleted_at列更新为“删除”时间。这将为Orders添加一个默认范围,这意味着如果你执行Order.all,它将仅返回nil deleted_at的订单。有关如何真正删除记录并将其包含在范围中的更多命令包含在上面的github中。

© www.soinside.com 2019 - 2024. All rights reserved.