Search code examples
ruby-on-rails-3delayed-jobgoogle-contacts-api

Saving import gmail contacts using delay job


I am importing gmail contacts, some users had huge number of contacts its taking long time to save in database. How to use in delay job to run in background asynchronously. I am using delay_job gem

Here is code I wrote

token = Google::Authorization.exchange_singular_use_for_session_token(params[:token])
unless token == false
  @contacts = Google::Contact.all(token)      
  @contacts.each do |contact|
    next if contact.email.nil?
    c = {
      :user_id => current_user.id,
      :source => 'gmail',
      :name => contact.name,
      :email => contact.email
    }
    c = Contact.find_or_initialize_by_email(c[:email])
    c.update_attributes(c)
  end
end

Solution

  • Add these gems in the Gemfile

    gem 'ghazel-daemons'
    gem 'delayed_job'
    

    then run

    bundle install
    
    rails g delayed_job:active_record
    
    rake db:migrate
    

    Then use the delay method provided by delayed job to run the process in background

    c = Contact.find_or_initialize_by_email(c[:email])
    c.delay.update_attributes(c)
    

    Start the delayed job process from the project root directory using the command,

    rake jobs:work
    

    For automating start/stop/restart after deployment, refer the documentation https://github.com/collectiveidea/delayed_job/wiki/Rails-3-and-Capistrano

    For more options, on how to use delayed job methods, you can check this page https://github.com/collectiveidea/delayed_job