0

我创建了以下脚本来擦除 mysql 数据库(并重置每个表的主键)。我想知道我应该如何重构它,以及如何从 ActiveSupport 中引入复数形式。

代码:

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

我的逻辑是,models 目录中没有 .rb 和复数形式的每个文件都代表数据库中的一个表,这就是我获得与该应用程序相关的表列表的方式。

我用这个命令运行它:rails runner script/cleandb.rb

这应该如何重构,我该如何引入复数形式?

4

1 回答 1

3

基于 Rails 约定,您应该能够使用以下代码以更安全的方式实现此目的(例如,如果您的模型具有特定的表名前缀或表名):

    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

请参阅有关 table_names 的文档:http: //apidock.com/rails/ActiveRecord/ModelSchema/ClassMethods/table_name

于 2013-08-24T09:55:07.527 回答