Сегодня я реализовывал генератор случайных уникальных строк для пользователя (скажем, что-то вроде токена забытого пароля)
поэтому я создаю генератор в * user_model *
def generate_random_string
random_string = CGI::escape( Base64.encode64(Digest::SHA1.digest("#{rand(1<<128)}/#{Time.now.to_f}/#{Process.pid}")))[0..12].downcase #I was required it has to have max 12 chars
if User.where( 'random_token_string = ?', random_string )
#if the string exist generate new one
self.generate_random_string
else
self.random_token_string = random_string
end
return random_string
end
100% работает в консоли в приложении для одного или нескольких пользователей
чем я собрал задачу RAKE, чтобы обновить существующих пользователей
task :generate_random_string_for_existing_users => :environment do
User.all.each do |user|
unless user.vanity_name
user.generate_random_string
p "#{user.id} failed to be updated for some reason !!!" unless user.save!
end
end
end
с моей точки зрения, все в порядке
но когда я запускаю грабли
RAILS_ENV=development rake generate_random_string_for_existing_users --trace
Я получаю
rake aborted!
stack level too deep
/home/tomi/.rvm/gems/ruby-1.9.2-p290@project/gems/activerecord-3.0.1/lib/active_record/connection_adapters/abstract/quoting.rb:10
... ни больше, ни меньше. Когда я попытался запустить его с консоли рельсов, он оказался неспокойным
теперь, когда я закомментирую рекурсию в * user_model *
#....
if User.where( 'random_token_string = ?', random_string )
#self.generate_random_string
else
#....
... это пройдет. Так что, если я правильно понимаю, RAKE пытается проявить смекалку еще до запуска кода.
Может кто-нибудь объяснить мне, почему?