require ‘rake’

namespace :public_uid do

desc "Generate public_uid on Models that have public_uid column on records that have nil value"
task :generate => :environment do
  Rails.application.eager_load! if defined?(Rails)
  ActiveRecord::Base.descendants.each do |model|
    model.connection # establish conection

    if model.instance_methods.collect(&:to_s).include?('generate_uid')
      puts "Model #{model.name}:"
      uid_column_name = model.public_uid_column
      model
        .where(uid_column_name => nil)
        .tap { |scope| puts "  * generating #{scope.count} #{uid_column_name}(s) for #{model.table_name}" }
        .find_each do |record_without_public_uid|
        record_without_public_uid.generate_uid
        record_without_public_uid.save!(validate: false)
      end
      puts ''
    end
  end
end

end