Rails 自定义迁移模板指南:用 lib/templates/migration.rb.tt 定制 Schema Migration 生成器
文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载本文整理自 TIL 仓库的 rails/customize-template-for-new-schema-migration.md围绕 Rails 迁移生成器展开默认的rails generate migration会使用框架内置的 ERB 模板生成迁移文件而通过在你的 Rails 应用中放置lib/templates/migration.rb.tt即可全局覆盖这份模板让每一次生成的迁移都自带你偏好的结构例如up/down方法加原始 SQL 的骨架。读完本文你将掌握 Rails 生成器的模板解析机制、自定义模板的编写规则以及生成过程中 locals 变量从哪来。Rails 生成器从脚手架到单个迁移文件Rails 提供了一套完整的生成器generator机制既可以用来脚手架出一整块应用model、controller、views、routes 等也可以小到只生成一个迁移文件。本仓库中多处实践都印证了这套机制的存在rails/generate-a-model.md 展示了bin/rails generate model Book title:string是如何一次性产出迁移文件、模型文件甚至还能让rspec-rails这类 gem 钩入生成器额外产出 spec 文件rails/scaffold-auth-functionality-with-rails-8-generator.md 展示了 Rails 8 内置的bin/rails generate authentication生成器在内部再次调用rails generate migration CreateUsers ...的完整链路。迁移文件的生成入口就是下面这条命令$ rails generate migration MakeUserStatusColumnNotNull运行这条命令时Rails 会根据给定的迁移名称在db/migrate/下创建一个时间戳前缀的迁移文件例如db/migrate/20241001000000_make_user_status_column_not_null.rb并基于名称推断出迁移类名MakeUserStatusColumnNotNull→MakeUserStatusColumnNotNull。默认行为Rails 内置的迁移模板当执行迁移生成命令时Rails 会取出框架内置的迁移模板baked-in migration templateactiverecord/lib/rails/generators/active_record/migration/templates/migration.rb.tt这份模板是一份 ERB.tt后缀即 Thor 模板文件它根据传入的迁移名称以及生成器内部设置的其他局部变量渲染出一个标准的迁移文件。默认情况下生成出的迁移会采用change方法风格形如class MakeUserStatusColumnNotNull ActiveRecord::Migration[8.0] def change change_column_null :users, :status, false end end这就是标准行为。不过这份模板并非不可撼动——Rails 允许你在应用内覆盖它。覆盖模板在 lib/templates/migration.rb.tt 中定义自己的迁移骨架要在你的 Rails 应用中替换默认迁移模板只需在应用的lib/templates/目录下创建同名文件lib/templates/migration.rb.tt文件名必须与内置模板保持一致migration.rb.tt这样 Rails 生成器在查找模板时会优先命中应用内的这份自定义模板。你需要遵循模板的基本结构ERB 语法、migration_class_name等变量约定但具体内容可以完全按需改写。需要注意该目录默认不会在新建 Rails 应用中预置需要手动创建lib/templates/目录并放入文件。实战模板up/down 方法 原始 SQL原文档作者的个人偏好是使用#up和#down方法并在迁移中直接写原始 SQL。为此他给出了一份可直接落盘的模板作为每次生成迁移的起点class % migration_class_name % ActiveRecord::Migration[% ActiveRecord::Migration.current_version %] def up execute ~SQL SQL end def down execute ~SQL SQL end end把这段内容保存为lib/templates/migration.rb.tt后再运行$ rails generate migration MakeUserStatusColumnNotNull生成出的迁移文件就会是这种结构你只需在up的 heredoc 中填入正向 SQL、在down的 heredoc 中填入回滚 SQL 即可class MakeUserStatusColumnNotNull ActiveRecord::Migration[8.0] def up execute ~SQL ALTER TABLE users ALTER COLUMN status SET NOT NULL; SQL end def down execute ~SQL ALTER TABLE users ALTER COLUMN status DROP NOT NULL; SQL end end这种写法的优势在于完全掌控 SQLDDL 细节、数据库方言特性不再受 ActiveRecord 迁移 DSL 抽象层的限制显式的双向迁移up/down成对出现方向清晰适合与change无法表达的操作例如需要自定义索引、复杂约束或不可逆但可手写回滚的变更时up/down是最直白的表达方式。仓库中的相关笔记也佐证了这一风格的合理性rails/make-remove-column-migration-reversible.md 指出remove_column单独写进change并不可逆需要补充类型参数而显式的up/down天然不存在这种歧义。模板变量从哪来migration_generator.rb 的 locals自定义模板中使用的% migration_class_name %并不是凭空出现的。原文档指出需要看 ActiveRecord 的迁移生成器实现activerecord/lib/rails/generators/active_record/migration/migration_generator.rb从该生成器的create_migration_file方法原文档标注约在第 26–43 行可以看到它负责两件事设置 locals局部变量把migration_class_name、table_name、attributes、migration_action、primary_key_type等值组装成哈希传给模板渲染选定模板文件通过 Thor 的template方法按约定查找模板——先查找lib/templates/migration.rb.tt应用级覆盖未命中则回落到框架内置的migration.rb.tt。从源码结构可以推断模板渲染遵循 Thor 的模板查找优先级应用内的lib/templates/会优先于 gem 内置模板被解析这正是“自定义模板生效”的底层原理。生成过程中迁移类名由你传入的名称推导而来其余变量如table_name、attributes则取决于你是否在命令中附带列定义# 仅指定名称只有迁移类名被设置 $ rails generate migration MakeUserStatusColumnNotNull # 附带字段定义table_name、attributes 等 locals 也会被填充 $ rails generate migration AddStatusToUsers status:boolean模板里可以自由使用这些 ERB 变量例如class % migration_class_name % ActiveRecord::Migration[% ActiveRecord::Migration.current_version %] def change add_column :% table_name %, :status, :boolean end endActiveRecord::Migration.current_version这一调用会在模板渲染时求值自动写入当前 Rails 版本的迁移基类版本号如Migration[8.0]无需手工维护。与 change 方法的取舍仓库中的对照参考自定义为up/down风格后你依然可以随时在该迁移内部改回change只要变更可逆。仓库中的 rails/write-reversible-migration-to-set-default.md 给出了一个很好的对照change_column_default可以用显式up/down分别设置false与nil也可以压缩成单方法的可逆形式def change change_column_default :books, :published, from: nil, to: false end这说明模板决定的是“生成的起点”而具体选择哪种风格仍取决于每次迁移的实际诉求——追求简洁的可逆变更用change需要精细控制 SQL 的用up/down。自定义模板只是让后者成为你的默认起点。此外rails/change-the-nullability-of-a-column.md 展示的change_column_null与 rails/add-timestamptz-columns-with-the-migration-dsl.md 展示的t.column :created_at, :timestamptz都表明当你需要超出 DSL 默认表达的能力如带时区的时间戳列、强制 NOT NULL时掌握底层模板与 SQL 输出是很有价值的技能。验证自定义模板是否生效创建lib/templates/migration.rb.tt后可以用以下方式快速验证# 生成一个迁移并观察输出文件的内容是否为你定义的骨架 $ rails generate migration AddIndexToUsersOnEmail # 然后打开 db/migrate/ 下最新生成的迁移文件检查 # 或在生成后预览不实际落盘部分 Rails 版本支持 dry-run $ rails generate migration AddIndexToUsersOnEmail --pretend如果生成的迁移文件依然沿用change风格请检查模板文件名是否为migration.rb.tt必须与内置模板同名同路径文件是否位于lib/templates/相对于 Rails 应用根目录而非test/或spec/下模板是否为合法的 ERB 语法% %输出、% %控制流。小结Rails 迁移生成器的默认模板藏在 ActiveRecord gem 内部而lib/templates/migration.rb.tt提供了一层应用级的覆盖入口。只需一个同名文件就能让团队所有成员用rails generate migration生成的代码天然符合统一规范——无论是up/down加原始 SQL还是其他任何你期望的骨架。理解migration_generator.rb如何设置 locals 与选择模板是驾驭这套自定义机制的关键。更完整的原始笔记见 rails/customize-template-for-new-schema-migration.md相关的迁移实践可继续翻阅本仓库 rails 目录下的其余迁移主题。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐Devise生成器模板自定义Migration与控制器Devise生成器模板自定义Migration与控制器 Devise作为Ruby on Rails生态中最流行的认证解决方案提供了强大的生成器工具来帮助开发认证鉴权后端Fast JSON API 生成器系统Rails 模板和自定义生成器终极指南 Fast JSON API 生成器系统Rails 模板和自定义生成器终极指南 欢迎来到 Fast JSON API 生成器系统的完整教程Fast JS后端Firecracker CPU 模板CPU Templates完全指南静态模板、自定义模板与 vCPU 特性定制Firecracker CPU 模板CPU Templates完全指南静态模板、自定义模板与 vCPU 特性定制 Firecracker 允许用户通过 C虚拟化云原生创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Java Web空气质量监测系统:从源码部署到AQI算法实现全解析

Java Web空气质量监测系统:从源码部署到AQI算法实现全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 3:59:22 阅读更多 →
嵌入式功耗优化必读:Linux内核Runtime PM机制全解析

嵌入式功耗优化必读:Linux内核Runtime PM机制全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:38:11 阅读更多 →
Java课设超市订单管理系统源码解析与答辩避坑指南

Java课设超市订单管理系统源码解析与答辩避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 9:28:08 阅读更多 →

最新新闻

从运维到安全:用应用层协议重新解读数据包

从运维到安全:用应用层协议重新解读数据包

1. 重新拿起抓包工具:同样的数据包,完全不同的解读方式 离开运维行业快十年,再回到网络安全这行,最强烈的感受不是技术更迭有多快,而是——同样一个数据包,十年前我看它和现在看它,完全是两个世…

2026/10/11 17:26:16 阅读更多 →
钢轨缺陷超声图像检测的Python实现与部署避坑

钢轨缺陷超声图像检测的Python实现与部署避坑

简介:基于超声图像的钢轨缺陷检测系统,提供完整源代码与已标注数据集,面向毕业设计、课程实训及目标检测算法学习者。方案采用YOLOv5单阶段检测算法,结合超声图像样本,覆盖裂纹、划痕、断裂等常见缺陷识别场景&#xf…

2026/10/11 17:26:16 阅读更多 →
纯Java零依赖实现TopoJSON生成器:从GeoJSON到共享弧线

纯Java零依赖实现TopoJSON生成器:从GeoJSON到共享弧线

两个多月前,我接到一个地图可视化的需求:后端要给前端提供一份行政区划 GeoJSON,光数据就有三十多兆,浏览器一加载就掉帧,拖拽和缩放卡得没法看。前端同事建议改成 TopoJSON 格式,说这种格式能把体积压到十…

2026/10/11 17:26:16 阅读更多 →
从VOC到YOLO:笔记本电脑数据集转换与YOLOv8训练全流程

从VOC到YOLO:笔记本电脑数据集转换与YOLOv8训练全流程

简介:围绕笔记本电脑与平板电脑场景构建的VOCYOLO格式目标检测数据集,面向计算机视觉初学者及需要训练笔记本检测模型的开发者,可支撑YOLO、Faster R-CNN等模型的训练与评估。数据集包含3524张真实场景图片,每张均配有VOC格式xml与…

2026/10/11 17:26:16 阅读更多 →
YOLO养殖场肉鸡目标检测:决定成败的不是模型而是数据集

YOLO养殖场肉鸡目标检测:决定成败的不是模型而是数据集

简介:面向养殖场肉鸡检测需求构建的YOLO目标检测数据集,适合目标检测初学者、算法工程师及智慧养殖项目开发者使用。数据以鸡舍实景图片与对应标注为主,可直接用于YOLOv5、YOLOv7、YOLOv8等主流模型训练,支撑肉鸡定位、计数与养殖…

2026/10/11 17:26:16 阅读更多 →
华为射频笔试题全解析:香农定理到5G波束赋形考点拆解

华为射频笔试题全解析:香农定理到5G波束赋形考点拆解

简介:面向射频通信类岗位求职者的华为最新招聘笔试题整理,针对无线通信与射频设计核心概念精心汇编,内容覆盖香农定理与信道容量、QPSK/8PSK/16QAM调制星座图、峰均比及对功放的挑战、噪声系数级联计算、S参数与电压驻波比、功率放大器最佳负…

2026/10/11 17:25:16 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →