Existe-t-il un moyen facile ou au moins élégant d'empêcher les doublons dans polymorphique has_many à travers les associations? J'ai deux modèles, des histoires et des liens qui peuvent être étiquetés. Je prends la décision consciente de ne pas utiliser un plugin ici. Je veux vraiment comprendre tout ce qui se passe et ne pas dépendre du code de quelqu'un d'autre que je ne comprends pas complètement.Rails empêchant les doublons dans polymorphique has_many: through les associations
Pour voir ce que ma question est en venir, si j'exécutez la commande suivante dans la console (en supposant que les objets de l'histoire et de balises existent dans la base de données déjà)
s = Story.find_by_id(1)
t = Tag.find_by_id(1)
s.tags << t
s.tags << t
Mes marquages table de jointure aura deux entrées ajoutées à lui, chacun avec les mêmes données exactes (tag_id = 1, taggable_id = 1, taggable_type = "Histoire"). Cela ne me semble pas très approprié. Ainsi, dans une tentative pour empêcher que cela se produise, j'ajouté ce qui suit à mon modèle de marquage:
before_validation :validate_uniqueness
def validate_uniqueness
taggings = Tagging.find(:all, :conditions => { :tag_id => self.tag_id, :taggable_id => self.taggable_id, :taggable_type => self.taggable_type })
if !taggings.empty?
return false
end
return true
end
Et il fonctionne presque comme prévu, mais si je tente d'ajouter une étiquette en double à une histoire ou d'un lien, je reçois un ActiveRecord :: RecordInvalid: Échec de l'exception de validation. Il semble que lorsque vous ajoutez une association à une liste, elle appelle la sauvegarde! (plutôt que de sauvegarder sans!) méthode qui soulève des exceptions si quelque chose se passe mal plutôt que de simplement retourner false. Ce n'est pas tout à fait ce que je veux arriver. Je suppose que je peux entourer toutes les tentatives d'ajouter de nouveaux tags avec un try/catch, mais cela va à l'encontre de l'idée que vous ne devriez pas attendre vos exceptions et c'est quelque chose que je m'attends à arriver.
Existe-t-il une meilleure façon de faire cela qui ne soulèvera pas d'exceptions alors que tout ce que je veux faire est simplement de ne pas sauvegarder l'objet dans la base de données parce qu'il existe un doublon?
C'est à peu près exactement ce que je veux. Cependant, je ne sais pas comment vous allez sur la surcharge de la balise << méthode. J'ai essayé de copier la méthode add_tags et de la renommer simplement "tags <<" mais elle me donne NoMethodError: méthode non définie 'tags 'pour # chaque fois que j'essaie de l'appeler. J'aimerais vraiment que la méthode << soit surchargée car il semble plus naturel de l'utiliser. –
seaneshbaugh
Oh ouais ... j'ai oublié, vous devez définir une méthode tags qui renvoie un objet qui a une méthode '' '. MAIS, self.tags << new_tags ne fonctionnera pas de toute façon, car cela va juste essayer d'ajouter un tableau de tags en tant qu'élément dans la collection de tags. Vous voudriez utiliser 'self.tags + = new_tags' pour cette ligne. Réponse mise à jour –