You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ActiveRecord事务中调用where()时目标记录被忽略的问题

解决ActiveRecord事务中Trade记录筛选被忽略的问题

我猜你大概率踩了Discard::Model的默认作用域坑!这个gem会自动给模型添加默认过滤规则,把已经被“软删除(丢弃)”的记录排除在常规查询之外——所以你用self.class.where(...)的时候,那些被标记为discarded的Trade根本不会出现在查询结果里,自然就被忽略了。

下面给你几个针对性的解决步骤:

1. 解除Discard的默认过滤

要查询所有记录(包括已丢弃的),你需要用Discard提供的with_discarded作用域来覆盖默认规则:

# 把事务里的删除代码改成这样
self.class.with_discarded.where(your_specific_conditions).destroy_all

这样执行查询时,就不会自动追加discarded_at IS NULL的条件,能匹配到所有符合参数的Trade记录。

2. 验证查询条件的正确性

有时候也可能是条件本身写得有问题,比如参数类型不匹配、字段名写错。建议先在Rails控制台里单独测试:

# 先确认能查到目标记录
Trade.with_discarded.where(your_specific_conditions).count

如果控制台里能查到结果,那可能是事务内的操作顺序或者上下文出了问题(比如之前的操作已经修改了记录字段,导致条件不再匹配)。

3. 事务内的额外注意事项

  • 可以在删除前打印实际执行的SQL,确认查询逻辑是否符合预期:
    puts self.class.with_discarded.where(your_specific_conditions).to_sql
    
  • 如果需要硬删除记录(而非Discard的软删除),别用destroy_all,改用以下方式:
    # 硬删除且触发回调
    self.class.with_discarded.where(your_specific_conditions).find_each do |trade|
      trade.really_destroy!
    end
    
    # 硬删除不触发回调(速度更快,但要注意跳过的业务逻辑)
    self.class.with_discarded.where(your_specific_conditions).delete_all
    

先试试用with_discarded包含所有记录,应该能解决你筛选被忽略的问题!

内容的提问来源于stack exchange,提问作者calyxofheld

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:36:04