2011-07-20 2 views
0

Je les modèles suivants:champ validates_uniqueness_of scope à une relation has_one

class Section < ActiveRecord::Base 
    belongs_to :course               
    has_one :term, :through => :course 
end 

class Course < ActiveRecord::Base 
    belongs_to :term 
    has_many :sections 
end 

class Term < ActiveRecord::Base 
    has_many :courses 
    has_many :sections, :through => :courses 
end 

Je voudrais être en mesure de faire ce qui suit dans mon modèle Section (call_number est un champ Section):

validates_uniqueness_of :call_number, :scope => :term_id 

Cela ne fonctionne évidemment pas parce que Section n'a pas term_id, alors comment puis-je limiter la portée au modèle d'une relation?

J'ai essayé de créer un validateur personnalisé pour Section sans résultat (ne fonctionne pas lorsque je crée une nouvelle Section avec l'erreur « méthode non définie « sections » pour nulle: NilClass »):

def validate_call_number 
    if self.term.sections.all(:conditions => ["call_number = ? AND sections.id <> ?", self.call_number, self.id]).count > 0 
    self.errors[:base] << "Call number exists for term" 
    false 
    end 
    true 
end 

Merci beaucoup!

Répondre

0

En supposant que votre code de validation est correct, pourquoi ne pas simplement ajouter une vérification de l'existence du terme?

def validate_call_number 
    return true if self.term.nil? # add this line 
    if self.term.sections.all(:conditions => ["call_number = ? AND sections.id <> ?", self.call_number, self.id]).count > 0 
    self.errors[:base] << "Call number exists for term" 
    false 
    end 
    true 
end 
+0

'term' semble toujours être" nul "avant une sauvegarde. Je pense que c'est parce que 'term' n'est disponible que pour la' section' à travers une relation. – zsalzbank

+0

@zsalzbank cela dépend si vous avez assigné un 'Course' à cette section. Si vous avez assigné un 'Course' à' Section' et que 'Course' a un' Term' 'self.term' ne devrait pas être nul même si l'instance de section est un nouvel enregistrement. – Fabio

Questions connexes