我正在编写一个脚本,以在应用程序中一次更改一堆表。但是我一直试图写入正在生成的迁移文件中,
这是我在工具中所拥有的:
system "rails g migration AddDefaultValueToBooleans"
file = "#{Rails.root}db/migrate/*add_default_value_to_booleans.rb"
def replace(filepath, regexp, *args, &block)
content = File.read(filepath).gsub(regexp, *args, &block)
File.open(filepath, 'wb') { |file| file.write(content) }
end
replace( file, /^def change/mi) { |match| "change_column :my_table, :my_column, null: false, default: false" }
replace
是一个不错的小方法,我在这里https://stackoverflow.com/a/2141540/8480602
,但是找不到我的文件。我不断收到错误消息
No such file or directory @ rb_sysopen - root_path/migrate/*add_default_value_to_booleans.rb (Errno::ENOENT)
我使用的文件路径是错误的,但是我似乎无法弄清楚如何正确地写它
答案 0 :(得分:1)
发布此消息后,才获得灵感。不知道是否有找到文件名的更好方法,但这可以。
Dir[Rails.root.join('db/migrate/*.rb').to_s].each do |filename|
if filename.include? "add_default_value_to_booleans"
file = filename
end
end
这里的主要问题是,如果迁移很多,效率可能会很低。
答案 1 :(得分:1)
我用this other answer帮助解决了这个问题。您的迁移文件将包含几乎随机的时间戳。您需要在db/migrate
中查找所有文件,并为您要查找的一个或多个文件获取正确的名称。
您无需在块之前初始化路径,只需知道文件名及其位置即可。
system "rails g migration AddDefaultValueToBooleans"
def replace(filename, regexp, *args, &block)
matching_files = []
Find.find('db/migrate') do |path|
matching_files << path if path.include? 'add_default_value_to_booleans.rb'
end
# then for every file found
matching_files.each do |filepath|
content = File.read(filepath).gsub(regexp, *args, &block)
File.open(filepath, 'wb') { |file| file.write(content) }
end
end
replace( file, /^def change/mi) { |match| "change_column :my_table, :my_column, null: false, default: false" }