открыть файл миграции из скрипта - PullRequest
0 голосов
/ 26 октября 2018

Я пишу скрипт для изменения нескольких таблиц одновременно в приложении. Но я застрял, пытаясь записать в файл миграции, который я генерирую,

вот что у меня есть в инструменте:

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 голосов
/ 26 октября 2018

Я использовал этот другой ответ , чтобы помочь и решить эту проблему.Ваш файл миграции будет содержать почти случайную временную метку.Вам нужно найти все файлы внутри 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" }
0 голосов
/ 26 октября 2018

только что получил вдохновение после публикации этого. Не уверен, что есть лучший способ найти имя файла, но это работает.

Dir[Rails.root.join('db/migrate/*.rb').to_s].each do |filename|
 if filename.include? "add_default_value_to_booleans"
  file =  filename 
 end
end

основная проблема здесь в том, что при большом количестве миграций это может быть довольно неэффективно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...