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

Rails ActiveRecord find_each未识别主键ID问题求助

问题分析与解决

可能原因

  • 模型主键配置异常:服务器环境中Subscriptions::Subscription模型的主键可能被错误设置为空字符串(比如误写self.primary_key = ''),导致find_each无法获取正确的主键字段生成排序语句。
  • Rails版本不一致:本地与服务器的Rails版本存在差异,部分版本的find_each在主键识别逻辑上存在bug,或者处理方式不同。
  • 数据库表结构变更:服务器端的subscriptions_subscriptions表主键字段被意外修改(比如主键被删除或重命名),导致模型无法识别正确的主键。
  • 隐含排序覆盖:可能存在未注意到的default_scope或其他链式作用域,引入了空排序规则,覆盖了find_each默认的主键排序。

解决步骤

  1. 检查模型主键配置
    打开Subscriptions::Subscription模型文件,确认没有错误设置主键的代码:

    # 确保没有类似以下错误代码
    # self.primary_key = ''
    

    如果存在错误配置,删除或修正为正确的主键字段(通常是id)。

  2. 对齐Rails版本
    在本地和服务器分别执行rails -v,确认版本一致。若不一致,将服务器Rails版本升级/降级至与本地相同,或查看对应版本的Rails官方文档,确认是否存在find_each相关的已知问题。

  3. 显式指定排序规则
    修改ready_to_cycle作用域,强制指定按id排序,避免依赖find_each的默认行为:

    scope :ready_to_cycle, ->{ cycleable.where("next_bill_date < ?", Time.now).order(id: :asc) }
    

    这样find_each会基于显式的排序语句分页,不会生成空字段的排序。

  4. 验证数据库表结构
    通过数据库客户端查看服务器上subscriptions_subscriptions表的结构,确认主键字段为id且未被修改。若主键异常,修复表结构恢复主键设置。

  5. 排查全局/默认作用域
    检查模型中是否存在default_scope,或其他被链式调用的作用域是否引入了空排序。例如:

    # 避免类似空排序的配置
    # default_scope { order('') }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:25:19