вот демо для очень простого (и неудачного) решения:
в вашей модели создайте массив с полями для заполнения, а также целочисленное поле для хранения текущего статуса, например:
class User < AR::Base
PROFILE_COMPLETENESS = %w[email, website_url, personal-info, etc ]
before_update :update_profile_progress, :if => Proc.new {|u| u.progress_status < 100}
private
def update_profile_progress
progress = 0
PROFILE_COMPLETENESS.each do |field|
progress += 1 unless field.blank?
end
self.progress_status = (progress / PROFILE_COMPLETENESS * 100).to_i
end
end
таким образом, каждый раз, когда пользователь обновляет свой профиль, процент обновляется (только если он ниже 100%).
возможно, есть лучшие решения, это просто возможный подход к проблеме;)