无法通过控制器的销毁操作遍历ActiveRecord_Associations_CollectionProxy对象?

时间:2019-01-23 00:45:04

标签: ruby-on-rails ruby-on-rails-4

我试图通过在销毁操作中循环访问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 []对象为空,因为在删除角色时,所有角色的孩子都被删除了。

即使删除操作被删除后,我如何确保捕获角色及其从属关系?我希望这是有道理的。我试图将其抽象化并尽可能地简单。抱歉,如果代码没有意义,我将在不公开很多代码的情况下进行解释。谢谢

编辑

我知道这个问题有问题。

正在播放另一张桌子Bundle。规则belongs_tobundlebundle都有has_many条规则。因此,通过删除角色,我想确保我能够发送一条消息,说明其中的包已通过删除规则进行了更新。

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

2 个答案:

答案 0 :(得分:1)

我的理解是您可以在模型中使用回调

打开您的榜样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

答案 1 :(得分:1)

您的代码意图似乎在您尝试抽象问题时就迷失了(这很好,简单的代码就可以了)。您的目标是在实例化新rules时使用SomeClass中的属性数据吗?换句话说,您想要删除记录(RoleRule),但要使用已删除的Rule中的属性来创建一些新的SomeClass实例

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

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