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”