ruby-on-rails - 如何使用 Ruby 语法获取新迁移文件的文件名
问题描述
因此,对我来说最令人沮丧的事情之一是试图在创建动态命名的迁移文件后获取它,以便在Ruby on Rails 应用程序模板中对其进行操作。
当我运行类似然后想用具有默认值等拼写run "rails g migration CreateSettings"
的预制迁移文件替换创建的迁移文件时,就会出现问题。null: false
由于动态时间戳精确到秒,因此很难确切知道文件名是什么。
我通过 StackOverflow 和在线进行了大量研究,许多人一直指向Dir.glob
查找文件,但问题是名称是动态创建的,如果我在那里有多个迁移文件,我需要确保它正在获取要替换的正确文件。
问题:
使用 Ruby 语法在调用后获取动态创建的迁移文件的完整文件名的最佳方法是什么rails g migration
?假设文件是在调用后创建 run "rails g migration CreateSettings"
的,因此动态名称将遵循命名语法:YYYYMMDDHHmmss_create_settings.rb
版本
- 使用 Rails -v 6.1.3
- 使用 Ruby -v 2.7.1p83
解决方案
经过大量的研究和反复试验,这是我想出的解决方案。
运行后,run "rails g migration CreateSettings"
我运行这个 Ruby 代码:
1. Dir.chdir('db/migrate/') {
2. Dir.glob('*.rb').each {|filename|
3. if filename.include? "create_settings"
4. file_location = 'db/migrate/' + filename
5. end
6. }
7. }
这段代码的作用是:
- (第 1 行)更改目录以查看迁移文件夹。
- (第 2 行)在该目录中,它找到所有带有
rb
扩展名的文件,并开始一次遍历它们(each
语句),每次迭代都将新文件名赋予变量filename
- (第 3 行)检查文件名字符串是否包含字符串“create_settings”
- (第 4 行)如果它确实包含该字符串,它会为文件路径(位置)保存一个新变量
- (第 5-7 行)关闭电路;-)
由于应该只有一个用于创建设置的迁移文件,因此这是可行的。对于将来使用它的任何其他人,请充分利用命名约定。例如,如果您将 Rails 应用程序名称的新字段添加到设置表中,您应该运行迁移“AddAppNameToSettings”而不是“AddFieldToSettings”。因为如果您再次执行此操作并再次拥有第二个迁移名称“AddFieldToSettings”,您将拥有两个具有不同时间戳但标题中带有“add_field_to_settings”的迁移文件,上面的代码将找到这两个文件。
我希望我的研究和时间可以在未来对其他人有所帮助,从而节省您研究这方面的时间。
快乐编码!
推荐阅读
- vue.js - 在Vue中实时保持时间和时差
- excel - Excel 索引间接关闭工作簿
- r - `[.default`(data, subgroups[[1]]) 中的错误:无效的下标类型“符号”
- html -
将html表格提取到R中,但在多页html中跳过具有三行/行的某一列中的特定元素( ) - mongoose - 异步等待中的错误处理
- java - 批处理未运行,JDBC
- android - 检查 LinearLayout 是否有 Clipped Child
- bash - awk 不写入文件
- specman - Specman e:如何打印指向结构的指针?
- javascript - 如何使用 Express.js 从所有对象中获取数据?