从脚本打开迁移文件

时间:2018-10-26 20:06:41

标签: ruby-on-rails ruby-on-rails-3

我正在编写一个脚本,以在应用程序中一次更改一堆表。但是我一直试图写入正在生成的迁移文件中,

这是我在工具中所拥有的:

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)

我使用的文件路径是错误的,但是我似乎无法弄清楚如何正确地写它

2 个答案:

答案 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" }