Ruby on Rails中已有personnels表,如何不删表使用scaffold?
解决办法
这个问题我之前也碰到过,核心原因是你运行rails g scaffold personnel时,Rails自动生成了一个创建personnels表的迁移文件,但你的数据库里已经存在这个表了,所以执行rails db:migrate就会报错。下面给你两种不用删表的解决方案,根据你的实际情况选就行:
方案一:刚生成scaffold还没改文件?直接重新生成跳过迁移
如果你刚执行完scaffold命令,还没修改生成的控制器、视图、模型这些文件,那最简单的方式是先撤销之前的生成操作,再重新生成时跳过迁移文件:
- 先撤销scaffold:
rails destroy scaffold personnel - 重新生成scaffold,加上
--skip-migration参数,这样就不会创建那个冲突的创建表迁移了:rails g scaffold personnel --skip-migration - 生成完成后,你需要确认
app/models/personnel.rb和现有数据库表的字段匹配——其实Rails默认会自动映射表的所有字段,只要表存在,你直接在控制器和视图里用@personnel.your_column_name就能访问对应字段,不用额外配置。
方案二:已经改了生成的文件?直接修改迁移文件
如果已经调整过scaffold生成的控制器、视图等内容,不想重新生成,那直接修改自动生成的迁移文件就行:
- 找到
db/migrate/目录下那个名字类似[时间戳]_create_personnels.rb的迁移文件 - 把里面的
create_table :personnels do |t| ... end代码块删掉,换成你需要的操作:- 如果现有表的结构已经完全符合需求,你可以把迁移改成空操作(这样执行migrate时只会标记这个迁移已完成,不会修改数据库):
class CreatePersonnels < ActiveRecord::Migration[7.0] def change # 空操作,只是让迁移标记为已执行 end end - 如果现有表还缺一些字段,直接在迁移里加字段就行(比如新增
phone字段):class CreatePersonnels < ActiveRecord::Migration[7.0] def change add_column :personnels, :phone, :string end end
- 如果现有表的结构已经完全符合需求,你可以把迁移改成空操作(这样执行migrate时只会标记这个迁移已完成,不会修改数据库):
- 最后运行
rails db:migrate就不会报错了。
内容的提问来源于stack exchange,提问作者Ezel
相关产品推荐
相关产品推荐

