Créer si l'enregistrement n'existe pas

J'ai 3 modèles dans mon application rails

class Contact < ActiveRecord::Base
  belongs_to :survey, counter_cache: :contact_count
  belongs_to :voter
  has_many :contact_attempts
end

class Survey < ActiveRecord::Base
  has_many :questions
  has_many :contacts
end

class Voter < ActiveRecord::Base
  has_many :contacts
end

le Contact se compose de la voter_id et un survey_id. La Logique de mon application est de comprendre qu'il puisse y avoir un seul contact pour l'électeur dans une enquête donnée.

droit maintenant, je suis en utilisant le code suivant pour faire appliquer cette logique. J'ai une requête à la table de contacts pour les enregistrements correspondant à la donnée voter_id et survey_id. si n'existe pas, elle est créée. sinon il ne fait rien.

if !Contact.exists?(:survey_id => survey, :voter_id => voter)
   c = Contact.new
   c.survey_id = survey
   c.voter_id = voter
   c.save
end

Évidemment, cela nécessite une sélection et une requête d'insertion pour créer 1 contact potentiel. Quand je suis ajoutant potentiellement des milliers de contacts à la fois.

Droit maintenant, je suis en utilisant Resque pour permettre à cette exécution en arrière-plan et à l'écart de la thread de l'interface utilisateur. Que puis-je faire pour accélérer le processus et de le rendre plus efficace?

  • Si vous êtes en train d'ajouter des milliers à la fois, pourquoi ne pas le faire avec une insertion en bloc ou d'un autre mécanisme à l'extérieur des AR?
InformationsquelleAutor gsueagle2008 | 2014-02-12