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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top