无法在控制器的销毁操作中循环遍历 ActiveRecord_Associations_CollectionProxy 对象?

Can't loop through an ActiveRecord_Associations_CollectionProxy object on controller's destroy action?

我试图通过在销毁操作中循环访问 ActiveRecord_Associations_CollectionProxy 中的单个项目。

为了最好地解释我的问题,我将分享一些代码。

我的控制器代码如下所示:

def destroy
  @role.destroy
  // Simple puts to show what data is here
  puts @role # => <Role:0x000055850068acb0>
  puts @role.rules.inspect # => <ActiveRecord::Associations::CollectionProxy []>
  @role.rules.map do | rule |
    puts rule # => doesn't output anything
    SomeClass.new(@role.rules, rule.field, ...).call_function()
  end
end

以下是我设置角色的方式:

def set_role
  @role = current_company.roles.find_by_id!(params[:id])
end

问题是循环遍历角色规则,即 @role.rules.map 不起作用,我猜这是因为角色的子角色已被删除。

该协会有一个 dependent: :destroy 子句。

正如我们所见,ActiveRecord::Associations::CollectionProxy [] 对象是空的,因为删除角色时角色的所有子角色都被删除。

即使删除了销毁操作,我如何确保捕获角色及其相关关联?我希望这是有道理的。我试图将其抽象化并尽可能简单。抱歉,如果代码没有意义,我会在不公开大量代码的情况下对其进行解释。谢谢

编辑

我发现这个问题有问题。

还有一个table在玩,Bundle。一个规则belongs_to一个bundle和一个bundlehas_many规则。因此,通过删除一个角色,我想确保我能够发送一条消息,说明捆绑包已随着规则的删除而更新。

NB SomeClass 是一个库 class,在 /lib 里面,我用来发送事件。这基本上意味着我正在发送一条消息,其中包含 Bundle 的详细信息。此消息告诉我们,当角色被删除时,规则也被删除,这是没有以下规则的 bundle

据我所知,您可以在模型中使用回调

打开你的榜样app/models/role.rb

class Role < ApplicationRecord
  # callback
    before_destroy :check_rules


  # here is the callback method that will run automatically before destroy
  def check_rules
    puts self # in model your @role is equal to self
    self.rules.map do |rule|
      puts rule
      # other action
    end
  end
end

你的代码的意图似乎在你抽象问题的努力中丢失了(这很好,简单的代码很好)。您的目标是在新 SomeClasses 的实例化中使用来自 rules 的属性数据吗?换句话说,您想删除记录(RoleRules)但是使用已删除的 Rules 的属性来创建一些新的 SomeClass 实例.

在我看来,在调用 @role.destroy 之前,您可以将 @role.rules.map(&:dup) 的结果存储在一个变量中。这将复制角色,但不会为它们分配新的 ID(或将它们存储在数据库中)。

或者,在调用 @role.destroy 之前实例化 SomeClass 有什么问题吗?或者您是否需要确保 @role 在创建 SomeClass 之前被销毁?