gpt4 book ai didi

ruby-on-rails - Ruby Rails 中的 Heisenbug 错误

转载 作者:太空宇宙 更新时间:2023-11-03 17:21:36 25 4
gpt4 key购买 nike

我称此为 Heisenbug 错误,因为该错误仅在未观察到时才存在。这是调用:

@selected_members  = Member.where(id: params[:member_ids])
@existing_members = list.members
@new_members = @selected_members.where('id not in (?)', @existing_members.map(&:id))
@members_to_lose = @existing_members.where('enterprise_members.id not in (?)', @selected_members.map(&:id))

Rails.logger.info @members_to_lose.length # Remove this line and it no longer works
list.members = @selected_members

render json: {members_to_add: @new_members, members_to_lose: @members_to_lose}

没有任何异常。

如果我删除了 Rails.logger.info 调用,则 @members_to_lose 返回错误(因为它返回空白)。

如果我将记录器或调试器放在 list.members = @selected_members 行之后,然后 @members_to_lose 被清空,并返回错误(因为它返回空白)。

如果不是 Rails.logger.info,我只是在 list.members 行之前放置一个 debugger,那么它将返回正确。

这里发生了什么?这是 ruby 竞争条件吗?我的代码中没有会影响此代码。 List.members 是一个简单的has_many 关系。

最佳答案

Rails 查询是惰性求值的 - 它们会在您真正需要它们时执行。

Rails.logger.info @members_to_lose.length

这会触发查询,因为您调用了方法 length。当您跳过此行时,查询将在以下位置执行:

render json: {members_to_add: @new_members, members_to_lose: @members_to_lose}

此时您已经保存了新成员。

要执行查询添加负载:

@members_to_lose   = @existing_members.where('enterprise_members.id not in (?)', @selected_members.map(&:id)).load

我还建议使用 select 而不是 map 以获得更好的性能:

@members_to_lose   = @existing_members.where('enterprise_members.id not in (?)', @selected_members.select('enterprise_members.id')).load

关于ruby-on-rails - Ruby Rails 中的 Heisenbug 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35317685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com