Rake пытается быть слишком умным и обнаруживать бесконечный цикл, даже не вызывая код - PullRequest
1 голос
/ 29 июля 2011

Сегодня я реализовывал генератор случайных уникальных строк для пользователя (скажем, что-то вроде токена забытого пароля)

поэтому я создаю генератор в * 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 пытается проявить смекалку еще до запуска кода. Может кто-нибудь объяснить мне, почему?

1 Ответ

1 голос
/ 29 июля 2011

Правосудие справедливо в отношении денег - вместо этого просто сделайте что-то вроде:

def build_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
end

def random_string_is_unique?(random_string)
    User.where(:random_tokent_string => random_string).count == 0
end

def generate_random_string
  # we'll loop until we find a unique code
  # it will execute build_random_string once before checking the while condition
  begin
    self.random_token_string = build_random_string
  end while random_string_is_unique?(random_token_string)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...