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?
Vous devez vous connecter pour publier un commentaire.
Vous devez ajouter d'abord une base de données de l'indice de force de cette condition au niveau le plus bas possible:
Ensuite, vous devez ajouter un caractère unique à la validation d'un ActiveRecord niveau:
Puis
contact.save
sera de retourfalse
si un contact existe pour un électeur et d'enquête.Mise à JOUR: Si vous créez l'index, puis le caractère unique de validation de courir assez vite.
Vous pouvez effectuer les opérations suivantes:
Voir si ces liens peuvent vous aider.
Ces liens sont pour les rails 4.0.2, mais vous pouvez le modifier dans l'api quais
De la apidock: first_or_create, find_or_create_by
Dans le cas des Rails de Guide: trouver ou créer-par
Il serait mieux si vous laissez MySQL pour gérer.
Créer une migration et d'ajouter un composite clé unique à
survey_id, voter_id
Maintenant
Va créer un nouveau dossier que si il n'y a pas de doublons.