Rails ActiveRecord find_each未识别主键ID问题求助
问题分析与解决
可能原因
- 模型主键配置异常:服务器环境中
Subscriptions::Subscription模型的主键可能被错误设置为空字符串(比如误写self.primary_key = ''),导致find_each无法获取正确的主键字段生成排序语句。 - Rails版本不一致:本地与服务器的Rails版本存在差异,部分版本的
find_each在主键识别逻辑上存在bug,或者处理方式不同。 - 数据库表结构变更:服务器端的
subscriptions_subscriptions表主键字段被意外修改(比如主键被删除或重命名),导致模型无法识别正确的主键。 - 隐含排序覆盖:可能存在未注意到的
default_scope或其他链式作用域,引入了空排序规则,覆盖了find_each默认的主键排序。
解决步骤
检查模型主键配置
打开Subscriptions::Subscription模型文件,确认没有错误设置主键的代码:# 确保没有类似以下错误代码 # self.primary_key = ''如果存在错误配置,删除或修正为正确的主键字段(通常是
id)。对齐Rails版本
在本地和服务器分别执行rails -v,确认版本一致。若不一致,将服务器Rails版本升级/降级至与本地相同,或查看对应版本的Rails官方文档,确认是否存在find_each相关的已知问题。显式指定排序规则
修改ready_to_cycle作用域,强制指定按id排序,避免依赖find_each的默认行为:scope :ready_to_cycle, ->{ cycleable.where("next_bill_date < ?", Time.now).order(id: :asc) }这样
find_each会基于显式的排序语句分页,不会生成空字段的排序。验证数据库表结构
通过数据库客户端查看服务器上subscriptions_subscriptions表的结构,确认主键字段为id且未被修改。若主键异常,修复表结构恢复主键设置。排查全局/默认作用域
检查模型中是否存在default_scope,或其他被链式调用的作用域是否引入了空排序。例如:# 避免类似空排序的配置 # default_scope { order('') }
内容的提问来源于stack exchange,提问作者ryanpitts1
相关产品推荐
相关产品推荐

