2009-09-14 15 views
10

Digamos que tengo Proyecto, que está en asociación muchos a muchos con Etiqueta. Estoy usando has_many a través de así que tengo un modelo de unión por separado.Validar la unicidad de muchos a muchos asociación en Rails

¿Cómo creo validación, que verifica la exclusividad del modelo de unión? Ahora solo tengo

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

Pero eso no se valida al guardar.

Respuesta

4

Probar validates_associated.

Creo que esto debería permitir que las validaciones del modelo de unión se ejecuten antes de guardar. Así, en su 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

Creo que lo que quiere es validates_uniqueness_of:

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

Esto es lo que estoy usando, y funciona bien.

+0

Hola, pero cuando agrego una etiqueta duplicada a un proyecto con 'project.tags << Tag.find_or_create_by_name" Design "' se produce una excepción 'ActiveRecord :: ValidateError', ¿hay alguna manera de suspender silenciosamente la duplicación mientras agregar la etiqueta sin problemas cuando la etiqueta es nueva? ¿Cuál es la mejor manera de gestionar esto? Gracias –

+0

Probablemente haya una manera más simple de hacerlo, pero creo que esto agregaría solo no duplicados: 'design_tags = Tag.find_or_create_by_name" Diseño " project.tags << design_tags.reject {| tag | project.tags.include? (tag)} ' –

Cuestiones relacionadas