UPDATE: Please have a look at valid_attributes
Problem: New validations vs. old data
Solution:
- find all models
- validate all
- print out those that are not valid
#task: rake db:validate_models
namespace :db do
def all_models
#get all active record classes
Dir.glob(RAILS_ROOT + '/app/models/**/*.rb').each do |file|
begin
require file unless file =~ /observer/
rescue
#require any possible file dependencies
if $!.to_s =~ /^uninitialized constant (\w+)$/
require $1.underscore + '.rb'
retry
else
raise
end
end
end
klasses = Object.subclasses_of(ActiveRecord::Base)
#throw out session if it is not stored in db
klasses.reject! do |klass|
klass == CGI::Session::ActiveRecordStore::Session && ActionController::Base.session_store.to_s !~ /ActiveRecordStore/
end
klasses.select{ |c| c.base_class == c}.sort_by(&:name)
end
desc "Run model validations on all model records in database"
task :validate_models => :environment do
#validate them
puts "-- records - model --"
all_models.each do |klass|
begin
total = klass.count
rescue
#tableless, session...
if $!.to_s =~ /Table .* doesn't exist/im
puts "No Table for: #{klass}"
next
end
raise
end
printf "%10dx %s\n", total, klass.name
chunk_size = 1000
(total / chunk_size + 1).times do |i|
chunk = klass.find(:all, :offset => (i * chunk_size), :limit => chunk_size)
chunk.reject(&:valid?).each do |record|
puts "#{record.class}: id=#{record.id}"
p record.errors.full_messages
puts
end rescue nil
end
end
end
end
One thought on “Validate All Models”