2009-09-14 17 views
10

Dire che ho Progetto, che è in associazione many-to-many con Tag. Sto usando has_many tramite quindi ho un modello di join separato.Convalida univocità di associazione molti a molti in Rails

Come si crea la convalida, che controlla l'unicità del modello di join? Ora ho solo

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

Ma questo non vale per il salvataggio.

risposta

4

Prova validates_associated.

Ciò dovrebbe, credo, consentire l'esecuzione delle convalide del modello di join prima del salvataggio. Quindi nel tuo caso:

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

Penso che quello che vuoi è validates_uniqueness_of:

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

Questo è quello che sto usando, e funziona bene.

+0

Ciao, ma quando aggiungo un tag duplicato a un progetto con 'project.tags << Tag.find_or_create_by_name" Design "' solleva un'eccezione di 'ActiveRecord :: ValidateError', c'è un modo per fallire silenziosamente durante la duplicazione mentre aggiungere il tag senza problemi quando il tag è nuovo? Qual è il modo migliore per gestirlo? Grazie –

+0

Probabilmente c'è un modo più semplice per farlo, ma penso che aggiungerei solo non duplicati: 'design_tags = Tag.find_or_create_by_name" Design " project.tags << design_tags.reject {| tag | project.tags.include? (tag)} ' –