Rails 7中belongs_to关联Fixture加载失败问题排查
RoR 7.0.6 Fixture加载报错:table "clientes" has no columns named "ciudad"
问题原因
你的clientes表实际不存在名为ciudad的列——当在迁移中使用t.belongs_to :ciudad时,Rails会自动生成**ciudad_id**作为外键列,而非ciudad。你在clientes.yml中使用ciudad: bogota的写法,Fixture加载器会尝试直接给不存在的ciudad列赋值,因此触发报错。
此前Ciudad相关测试正常,是因为那些测试未涉及Cliente与Ciudad的关联加载,没有触发列不存在的问题。
解决方法
有两种可靠的修复方式:
方法1:直接使用外键列名
修改clientes.yml,将ciudad替换为ciudad_id,直接引用Ciudad Fixture的标签名:
one: nombre: Ingenieros Ingenieria nit: 900.000.000-1 direccion: "Calle 1 # 1-1" ciudad_id: bogota etiquetas: "[]" otros_nombres: "[]" two: nombre: Otro Cliente nit: 9004441112 direccion: "Baker Street 221B" ciudad_id: medellin etiquetas: '["VIP"]' otros_nombres: '["El Cliente"]'
方法2:使用Fixture引用语法(更健壮)
利用Rails提供的ActiveRecord::FixtureSet.identify方法获取关联Fixture的ID,这种方式在ID规则(比如非自增ID)变化时更稳定:
one: nombre: Ingenieros Ingenieria nit: 900.000.000-1 direccion: "Calle 1 # 1-1" ciudad_id: <%= ActiveRecord::FixtureSet.identify(:bogota) %> etiquetas: "[]" otros_nombres: "[]" two: nombre: Otro Cliente nit: 9004441112 direccion: "Baker Street 221B" ciudad_id: <%= ActiveRecord::FixtureSet.identify(:medellin) %> etiquetas: '["VIP"]' otros_nombres: '["El Cliente"]'
修复后重新执行命令即可正常加载Fixture:
rails db:fixtures:load RAILS_ENV=test
内容的提问来源于stack exchange,提问作者Alejo Dev
相关产品推荐
相关产品推荐

