Ignorer les erreurs de validation spécifiques
-
21-09-2019 - |
Question
Je Labellings
qui appartiennent à Emails
et Labels
.
Chaque étiquetage doit être unique à la paire email / label -. Si un e-mail ne peut être étiqueté 'test' une fois
Je fais cela avec validates_uniqueness_of :label_id, :scope => :email_id
. Cela fonctionne comme prévu.
Quand je suis des e-mails étiquetage, je veux ajouter l'étiquetage si elle est unique, et ne rien faire si le courriel est déjà étiqueté avec cette étiquette.
Je ne veux pas dupliquer les fonctionnalités de validation autour de mon application avec quelque chose comme:
email.labels << label unless email.labels.include?(label)
Est-il possible d'assurer que chaque marquage a une paire de email_id / label_id unique, sans avoir à vérifier manuellement ou gérer les exceptions?
La solution
Je ne l'ai pas testé, mais vous pouvez probablement passer outre <<
dans le proxy d'association, quelque chose comme:
class Email < ActiveRecord::Base
has_many :labelings
has_many :labels, :through => :labelings do
def <<(label)
unless proxy_owner.labels.include?(label)
proxy_owner.labelings << Labeling.new(:email => proxy_owner, :label => label)
end
end
end
end