我创建了以下脚本来擦除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
如何重构,以及如何引入复数?
答案 0 :(得分: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
请参阅table_names上的文档:http://apidock.com/rails/ActiveRecord/ModelSchema/ClassMethods/table_name