检查记录是否刚刚在Rails中被破坏

liwlm1x9  于 2022-10-15  发布在  Ruby
关注(0)|答案(7)|浏览(120)

所以就有了

record.new_record?

检查某事是否为新事物
我要检查一下是不是有什么东西出来了。

record = some_magic
record.destroy
record.is_destroyed? # => true

差不多是这样。我知道破坏会冻结物体,所以冻结了?有点管用,但这项任务有什么明确的内容吗?

blpfk2vs

blpfk2vs1#

就这么做吧:

record.destroyed?

详细信息在此处ActiveRecord::Persistence

2jcobegt

2jcobegt2#

你可以做到的。

Record.exists?(record.id)

然而,这将对数据库造成冲击,这并不总是必要的。我所知道的唯一另一种解决方案是像IV提到的那样进行回调。

attr_accessor :destroyed
after_destroy :mark_as_destroyed
def mark_as_destroyed
  self.destroyed = true
end

然后检查record.destroyed

r1zhe5dt

r1zhe5dt3#

这很快就会到来。在最新的Riding Rails帖子中,它写道:
最后,它不一定与BugMash相关,但JoséValim-在其他几十个提交中-添加了模型。销毁?只有当您当前查看的示例被成功销毁时,这个漂亮的方法才会返回TRUE。
这就对了。马上就来!

o2g1uqev

o2g1uqev4#

destroy只返回对freeze的调用(据我所知),所以我认为frozen?是最好的选择。如果你做了像record.reload这样的事情,你的另一个选择是从ActiveRecord::RecordNotFound中拯救出来。
我认为Mike上面的策略可能是最好的,或者如果你想开始“做假设”,你也可以为上面提到的这些案例编写一个 Package 。
干杯。

8xiog9wr

8xiog9wr5#

当唱片被毁的时候?运行良好,并且确实返回TRUE或FALSE,您也可以稍作处理,并在控制器中调用Destroy的行上创建if条件。

record = Object.find(params[:id])
if record.destroy
  ... happy path
else
  ... sad path
end

意识到这个帖子在游戏中有点晚了。但如果有人想要更多地讨论这个问题,我很乐意!附注:我在我的模型上也有一个After_Destroy验证,虽然它有效,但对于类似的事情,一个单独的方法似乎有点过头了;)

rfbsl7qr

rfbsl7qr6#

在没有更多了解你的应用程序的逻辑的情况下,我认为这是冻结的?是你最好的选择。
如果做不到这一点,您当然可以向您的模型添加一个在回调中触发的“DESTOLED”属性,如果您想要一个更精确的解决方案,可以对照该属性进行检查。

dwbf0jvd

dwbf0jvd7#

简短的答案是:

record.destroyed? # fastest, doesn't require extra database check

  Record.exists?(record) # slower

不要使用record.destroy的返回值,它将“始终”返回记录的冻结示例,无论它是否被删除,就在您试图删除它之前。查看此处:https://apidock.com/rails/v5.2.3/ActiveRecord/Persistence/destroy
如果您在控制器中,destroy!将抛出一个ActiveRecord::RecordNotDestroyed,您可以根据before_destroy回调来捕获它。

def destroy
  render json: @record.destroy!
rescue ActiveRecord::RecordNotDestroyed
  # @record will work fine down here, it still exists.
  render json: { errors: ["Record not destroyed"] }
end

相关问题