2009-12-24 19 views
0

J'ai Labellings qui appartiennent à Emails et Labels.Ignorer les erreurs de validation spécifiques

Chaque étiquetage doit être unique à la paire e-mail/étiquette. Ainsi, un e-mail ne peut être étiqueté «test» qu'une seule fois. Je fais cela avec validates_uniqueness_of :label_id, :scope => :email_id. Cela fonctionne comme prévu. Quand j'étiquetage des courriels, je veux ajouter l'étiquette si elle est unique, et ne fais rien si l'email 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 étiquetage comporte un email_id unique,/paire label_id sans avoir à vérifier manuellement ou gérer des exceptions?

Répondre

1

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 
+0

fantastique - fonctionne un régal! M'a également appris de nouveaux conseils sur ActiveRecord :) – nfm