2013-08-24 2 views
0

Создал следующий скрипт, чтобы стереть базу данных mysql (и сбросить первичные ключи каждой таблицы). Мне интересно, как мне его реорганизовать, и как я мог бы плюрализировать ActiveSupport.Рефакторинг простого сценария для очистки базы данных mysql в ruby ​​

Код:

MODEL_DIR = File.expand_path("app/models") 

Dir.chdir(MODEL_DIR) 
files = Dir.glob(File.join("**", "*.rb")) 

files.map! do |file| 
    file[0..-4] + "s" 
end 

print "This will WIPE your database. Continue? (y/n): " 
if $stdin.gets.chomp.downcase == "y" 
    files.each do |f| 
    puts "Wiping #{f}.." 
    ActiveRecord::Base.connection.execute "TRUNCATE TABLE #{f};" 
    end 
else 
    puts "Terminating script..." 
end 

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

я запустить его с помощью этой команды: rails runner script/cleandb.rb

Как это должно быть переработан, и как я могу тянуть в множественном числе?

+0

Как вы должны изменить свой код на основе мнения, а не на тип вопроса для переполнения стека. Пожалуйста, прочитайте раздел справки: http://stackoverflow.com/help/dont-ask Попробуйте использовать плюрализацию, и если это не сработает, опубликуйте специфику проблемы, которую вы испытываете. – xaxxon

+0

Привет, почему бы просто не использовать таблицы show в mysql для отображения всех таблиц и их усечения? – Bigxiang

+0

Попробуйте опубликовать это на: http://codereview.stackexchange.com/ – Martin

ответ

3

на основе Rails конвенций, вы должны быть в состоянии добиться этого в безопасном способе (например, если у вас есть конкретные prexises имени таблицы или таблица имена для ваших моделей) со следующим кодом:

print "This will WIPE your database. Continue? (y/n): " 
    if $stdin.gets.chomp.downcase == "y" 
     # iterate over all model definition files 
     Dir["#{Rails.root}/app/models/**/*.rb"].map do |model_filename| 
     # get the file base_name 
     model_file_basename = File.basename(model_filename,File.extname(model_filename)) 
     # get the model class from the file basename 
     model_class = model_file_basename.camelize.constantize 
     # ask the model (ActiveRecord::Base subclass) to give you its table_name 
     table_name = model_class.table_name 
     # wipe the table 
     puts "Wiping table #{table_name}.." 
     ActiveRecord::Base.connection.execute "TRUNCATE TABLE #{table_name};" 
     end 
    else 
     puts "Terminating script..." 
    end 

См документация по табличным_имятам: http://apidock.com/rails/ActiveRecord/ModelSchema/ClassMethods/table_name

+0

Спасибо, что указали это на Нико, это именно то, что я искал. Приветствия. – Senjai

Смежные вопросы