2010-07-06 6 views
3

Existe-t-il un moyen de valider qu'une association polymorphe est uniquement liée à un élément? par exemple, si j'ai des commentaires qui sont polymorphes et peuvent être sur des photos, des publications, etc. Je veux m'assurer que si j'ajoute un commentaire à une liste de commentaires, si le commentaire est déjà associé à la publication , l'ajout échouera. (erreur d'unicité de validation). Des idées?Validation d'association polymorphique?

Répondre

6

Je devine que vous avez quelque chose comme ceci:

class Comment < ActiveRecord::Base 
    belongs to commentable, :polymorphic => true 
end 

class Post < ActiveRecord::Base 
    has_many :comments, :as => commentable, :dependent => :destroy 
end 

class Photo < ActiveRecord::Base 
    has_many :comments, :as => commentable, :dependent => :destroy 
end 

En supposant que votre modèle Comment a quelques attributs comme author et body (que vous voulez être unique), vous pouvez alors créer une validation personnalisée dans ce modèle comme celui-ci:

validate do |comment| 
    if comment.commentable_type.constantize.comments.find_by_author_and_body(comment.author, comment.body) 
    comment.errors.add_to_base "Duplicate comment added for ..." 
    end 
end 

J'ai aussi supposé que sont créés quelque chose comme commentaires ceci:

@post.comments.create(:author => name, :body => comment_text) 
+0

En fait, c'est un polymorphe avec un has_many à travers une table de jointure, donc l'association polymorphique est dans la table de jointure. Je viens de mettre une validation sur le _id et _type portée avec l'ID de l'article et cela a très bien fonctionné. – tesserakt

Questions connexes