2009-09-14 10 views
10

Dites que j'ai Projet, qui est en association plusieurs-à-plusieurs avec Tag. J'utilise has_many à donc j'ai un modèle de jointure séparé. Comment créer une validation, qui vérifie l'unicité du modèle de jointure?Valider l'unicité de plusieurs à plusieurs association dans Rails

Maintenant, j'ai seulement

has_many :tags, :through => :taggings, :uniq => true 

Mais cela ne valide pas lors de la sauvegarde.

Répondre

4

Essayez validates_associated.

Cela devrait, je crois, permettre aux validations du modèle de jointure de s'exécuter avant l'enregistrement. Donc, dans votre cas:

class Project 
    has many :tags, :through => :taggings 
    validates_associated :taggings 
end 

class Taggings 
    belongs_to :tags 

    #your validations here.... 
end 

class Tag 
    has_many :taggings 
end 
15

Je pense que ce que vous voulez est validates_uniqueness_of:

class Taggings 
    belongs_to :tags 
    validates_uniqueness_of :tag_id, :scope => :project_id 
end 

C'est ce que j'utilise, et fonctionne bien.

+0

Salut, mais lorsque j'ajoute un tag dupliqué à un projet avec 'project.tags << Tag.find_or_create_by_name" Design "' il déclenche une exception 'ActiveRecord :: ValidateError', est-il possible d'échouer silencieusement lors de la duplication ajouter la balise sans problèmes quand la balise est neuve? Quelle est la meilleure façon de gérer cela? Merci –

+0

Il y a probablement une façon plus simple de le faire, mais je pense que cela ajouterait seulement des non-doublons: 'design_tags = Tag.find_or_create_by_name" Conception " project.tags << design_tags.reject {| tag | project.tags.include? (tag)} ' –

Questions connexes