Rails创建ProjectGroup报错:SQLite3提示不存在main.ProjectTypes表
问题:创建ProjectGroup时SQLite提示找不到ProjectTypes表
问题现象
- 已通过浏览器成功创建ProjectType,但创建ProjectGroup时触发错误:
ActiveRecord::StatementInvalid in ProjectGroupsController#create SQLite3::SQLException: no such table: main.ProjectTypes - IRB中可正常执行
ProjectType.all获取数据,说明表实际存在 - 选择不存在的Projecttype:2时,仅返回表单验证错误("Projecttype must exist"),不会导致页面崩溃
- 执行
PRAGMA foreign_key_check时,ProjectGroups与ProjectTypes的关联报错,同时影响fixtures数据加载
数据库Schema
create_table "project_groups", force: :cascade do |t| t.string "name" t.integer "ProjectType_id", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["ProjectType_id"], name: "index_project_groups_on_ProjectType_id" end create_table "project_types", force: :cascade do |t| t.string "name" t.datetime "created_at", null: false t.datetime "updated_at", null: false end add_foreign_key "project_groups", "ProjectTypes"
IRB测试结果
irb(main):008> ProjectGroup.new(name:"something", ProjectType_id:1) => #<ProjectGroup:0x000000012d995150 id: nil, name: "something", ProjectType_id: 1, created_at: nil, updated_at: nil> irb(main):009> ProjectGroup.create(name:"something", Project_Type_id:1) (irb):9:in `<main>': unknown attribute 'Project_Type_id' for ProjectGroup. (ActiveModel::UnknownAttributeError) raise UnknownAttributeError.new(self, k.to_s) ^^^^^ irb(main):010> ProjectGroup.create(name:"something", ProjectType_id:1) TRANSACTION (0.2ms) begin transaction ProjectType Load (0.7ms) SELECT "project_types".* FROM "project_types" WHERE "project_types"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ProjectGroup Create (0.4ms) INSERT INTO "project_groups" ("name", "ProjectType_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) RETURNING "id" [["name", "something"], ["ProjectType_id", 1], ["created_at", "2024-06-01 03:03:05.944403"], ["updated_at", "2024-06-01 03:03:05.944403"]] TRANSACTION (0.1ms) rollback transaction (irb):10:in `<main>': SQLite3::SQLException: no such table: main.ProjectTypes (ActiveRecord::StatementInvalid)
解决方向
修正外键关联的表名:SQLite默认(非Windows环境)区分表名大小写,当前外键关联使用了大写的
ProjectTypes,但实际表名是小写的project_types,导致找不到表。需将add_foreign_key "project_groups", "ProjectTypes"改为add_foreign_key "project_groups", "project_types"。统一字段命名符合Rails约定:当前关联字段使用驼峰式
ProjectType_id,不符合Rails蛇形命名规范(project_type_id),需修改:- 生成迁移文件:
rails generate migration RenameProjectTypeIdToProjectTypeIdInProjectGroups - 在迁移文件中写入:
def change rename_column :project_groups, :ProjectType_id, :project_type_id end - 执行迁移:
rails db:migrate
- 生成迁移文件:
修正模型关联配置:
- 在
ProjectGroup模型中设置正确关联:class ProjectGroup < ApplicationRecord belongs_to :project_type end - 可选:在
ProjectType模型添加反向关联:class ProjectType < ApplicationRecord has_many :project_groups end
- 在
重新配置外键(若需要):如果修改字段名后外键仍异常,先移除旧外键再添加新的:
remove_foreign_key :project_groups, :ProjectTypes add_foreign_key :project_groups, :project_types
内容的提问来源于stack exchange,提问作者baed
相关产品推荐
相关产品推荐

