使用Devise的Rails引擎迁移后,schema.rb为何生成在test/dummy/db而非引擎db目录?
问题原因
在Rails引擎目录下执行rails db:migrate时,默认会关联到引擎内置的test/dummy测试应用——这是Rails引擎的默认行为,dummy应用用于测试引擎功能,因此迁移会作用于dummy的数据库,schema.rb自然生成在test/dummy/db目录下。
Rails引擎本身并不需要维护独立的schema.rb,因为引擎的数据库表最终是要被宿主应用的数据库整合的,正常流程是由宿主应用加载引擎的迁移并执行。
解决方案
如果你确实需要在引擎目录下生成专属的schema.rb,可以按以下步骤操作:
添加引擎专属的数据库配置
在引擎根目录创建config/database.yml,配置独立的数据库实例:development: adapter: sqlite3 database: db/development.sqlite3 test: adapter: sqlite3 database: db/test.sqlite3指定配置执行迁移
执行迁移时,明确指定使用引擎的数据库配置:rails db:migrate --config=config/database.yml或者通过环境变量指定:
DATABASE_URL=sqlite3://./db/development.sqlite3 rails db:migrate生成schema.rb
迁移完成后,执行以下命令生成引擎目录下的schema.rb:rails db:schema:dump --config=config/database.yml
补充说明
如果你的核心需求是让宿主应用使用引擎的User模型,无需在引擎目录生成schema.rb:
- 确保引擎的迁移文件放在
my_engine/db/migrate目录下 - 在宿主应用执行
rails db:migrate,Rails会自动加载引擎的迁移并执行,宿主应用的db/schema.rb会包含my_engine_users表
内容的提问来源于stack exchange,提问作者Maxime
相关产品推荐
相关产品推荐

