从Rails 2.7升级至Ruby 3.0后执行schema:load出现参数错误
add_foreign_key参数数量不匹配的报错问题 执行RAILS_ENV=test bundle exec rake db:schema:load时触发ArgumentError: wrong number of arguments (given 3, expected 2),错误指向schema.rb第1060行的add_foreign_key "artifacts", "properties", on_update: :cascade语句。即便你确认add_foreign_key的方法定义是from_table、to_table和**options,仍出现报错,核心原因集中在版本兼容或自定义代码干扰,以下是具体解决方案:
1. 核对Rails版本对on_update参数的支持
Rails 5.0及以上才正式支持on_update作为add_foreign_key的选项。如果你的项目用的是Rails 4.x或更早版本,这个参数不被原生方法识别,会导致参数解析异常——旧版本的add_foreign_key仅接受两个参数(表名+选项哈希,或表名+关联表名),无法处理第三个on_update参数。
- 验证方式:执行
rails -v查看版本,若低于5.0,要么移除on_update: :cascade选项,要么升级Rails到兼容版本。
2. 更新数据库适配器版本
如果用的是MySQL,旧版mysql2 gem可能和当前Rails版本不兼容,导致add_foreign_key的参数解析逻辑出错。执行bundle update mysql2将适配器升级到适配当前Rails的稳定版,再重新执行rake db:schema:load。
3. 排查自定义重写代码
检查项目的lib/目录、config/initializers/下的初始化文件,是否有重写ActiveRecord::ConnectionAdapters::SchemaStatements#add_foreign_key的代码。这类自定义代码可能修改了方法的参数结构,导致调用时参数数量不匹配。如果找到,要么调整参数定义匹配原生方法,要么移除不必要的重写。
4. 临时改用原生SQL(应急方案)
如果需要快速绕过问题,可以把schema.rb中的add_foreign_key语句替换为原生SQL:
execute <<-SQL ALTER TABLE artifacts ADD CONSTRAINT fk_artifacts_properties FOREIGN KEY (property_id) REFERENCES properties(id) ON UPDATE CASCADE; SQL
注意把property_id替换为实际的外键字段名,之后重新执行加载命令。
内容的提问来源于stack exchange,提问作者Kamilski81

