我试图通过在销毁操作中循环访问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_to
,bundle
和bundle
都有has_many条规则。因此,通过删除角色,我想确保我能够发送一条消息,说明其中的包已通过删除规则进行了更新。
NB SomeClass
是一个库类,在/lib
中,我用来发送事件。这基本上意味着我正在发送包含Bundle
详细信息的消息。该消息告诉我们,删除角色后,规则也被删除,这是bundle
,没有以下规则。
答案 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
中的属性数据吗?换句话说,您想要删除记录(Role
和Rule
),但要使用已删除的Rule
中的属性来创建一些新的SomeClass
实例
在我看来,在调用@role.destroy
之前,您可以将@role.rules.map(&:dup)
的结果存储在变量中。这将复制角色,但不会为它们分配新的ID(或将其存储在数据库中)。
或者,仅在调用SomeClass
之前实例化@role.destroy
es有什么问题吗?还是需要在创建@role
之前确保SomeClass
被销毁?